A unique string ID generator for Javascript, JVM and Native written in Kotlin.
KMP-NanoId uses Korlibs Krypto SecureRandom to generate cryptographically strong random IDs with a proper distribution of characters.
Krypto provides a SecureRandom
class that extends the kotlin.random.Random
class, but generating cryptographic secure values.
It uses SecureRandom
on the JVM + PRNGFixes
on Android. On Native POSIX (including Linux, macOs and iOS), it uses /dev/urandom
, on Windows BCryptGenRandom
KMP-NanoId generates compact IDs with just 21 characters.
By using a larger alphabet than UUID, KMP-NanoId can generate a greater number of unique IDs, when compared to UUID, with fewer characters (21 vs 36)
KMP-NanoId uses URL-friendly character (A-Za-z0-9_-
). Perfect for unique identifiers in web applications.
KMP-NanoId is fully customizable.
All default options may be overridden. Supply your own Random Number Generator, alphabet or size.
KMP-NanoId is thoroughly tested with Kotlin Test
KMP-NanoId provides one easy-to-use utility class (NanoIdUtils
) with multiple methods to generate IDs.
The default method creates secure, url-friendly, unique ids.
It uses a url-friendly alphabet (A-Za-z0-9_-
), a secure random number generator, and generates a unique ID wit 21 characters.
String id = NanoIdUtils.randomNanoId();
val id = NanoIdUtils.randomNanoId()
Additional methods allow you to generate custom IDs by specifying your own random number generator, alphabet or size.
Methods created by @JvmOverloads
Random random = new Random();
char[] alphabet = {'a', 'b', 'c'};
int size = 10;
// Only change random number generator
String idRandom = NanoIdUtils.randomNanoId(random);
// Change random number generator and alphabet
String idRandomAlphabet = NanoIdUtils.randomNanoId(random, alphabet);
// Change all parameter
String idRandomAlphabetSize = NanoIdUtils.randomNanoId(random, alphabet, size);
val kRandom = Random()
val kAlphabet = charArrayOf('a', 'b', 'c')
val kSize = 10
// Only change random number generator
val idRandom = NanoIdUtils.randomNanoId(kRandom)
// Change random number generator and alphabet
val idRandomAlphabet = NanoIdUtils.randomNanoId(kRandom, kAlphabet)
// Change all parameter
val idRandomAlphabetSize = NanoIdUtils.randomNanoId(kRandom, kAlphabet, kSize)
// Change alphabet only (keep default random number generator and size)
val idAlphabet = NanoIdUtils.randomNanoId(alphabet = kAlphabet)
// Change size only (keep default random number generator and alphabet)
val idSize = NanoIdUtils.randomNanoId(size = kSize)
// Change alphabet and size (keep default random number generator)
val idAlphabetSize = NanoIdUtils.randomNanoId(alphabet = kAlphabet, size = kSize)
Needed in Java (can be used in Kotlin)
// Useful to keep some default values and change only specific
NanoIdUtils.DEFAULT_NUMBER_GENERATOR
NanoIdUtils.DEFAULT_ALPHABET
NanoIdUtils.DEFAULT_SIZE
// Usage example
String idAlphabet = NanoIdUtils.randomNanoId(Random(), NanoIdUtils.DEFAULT_ALPHABET, 10);
Code released under the MIT License
- C#
- Clojure and ClojureScript
- Crystal
- Dart
- Go
- Elixir
- Haskell
- Java
- JavaScript
- Nim
- PHP
- Python
- Ruby
- Rust
- Swift
Also, a CLI tool is available to generate IDs from the command line.