概要
NanoID というものがあると以下の記事で知りました。
UUID よりもコンパクトで、また使う文字を生成時に制限できる点が特徴のようです。後者の特徴は、
例えばランダムなファイル名や URL のパスを生成したい時に役立ちそうです。
Java での実装
Java の実装を探してみたところ、 JNanoId というライブラリーがあったので試してみました。
最新のバージョンは 2.0 で、最終リリースが2018年11月と大分古いです。
ライセンスは MIT License です。
130行ほどの小さなクラス1つです。テストコードもあります。
特徴
- Secure……Java の SecureRandom を用いている
- Compact……長さが21なので UUID よりも短い
- URL-Friendly……出力される ID は (A-Za-z0-9_-) に限定されているので、URL に用いることができる
- Customizable……ID生成に用いる文字と、IDの長さを制限することができる
使用
依存の追加
build.gradle に依存を1行追加してください。
dependencies {
implementation("com.aventrix.jnanoid:jnanoid:2.0.0")
}
基本的な使い方
NanoIdUtils.randomNanoId()
をコールするだけで NanoID の文字列を生成してくれます。非常に簡単です。
import com.aventrix.jnanoid.jnanoid.NanoIdUtils
fun main() {
repeat(10) { println(NanoIdUtils.randomNanoId()) }
}
MPKasmT5l0YxpnJe_Qfm1
594vTh1V5Y-cK4B-PgZzt
0vsaKgBxLbLrRnAA9c4lD
UL9GiWbUBKjOqqrST3o9k
OnfVWpbe2UJqpYawqkK_q
tv3sGbsEnDHHmMCgrHHfP
ai6qqzErVFWTUka6OO5Gw
FSmTiYVXyNYJwhPnYBM4-
カスタムIDの生成
また、ID生成に使う文字を制限することもできます。
NanoIdUtils.randomNanoId(SecureRandom(), charArrayOf('a', 'x', '2', '$', '@'), 12)
こうすると、'a', 'x', '2', '$', '@' だけの組み合わせで長さ12のIDを生成してくれます。
$@$aa@@@$@@2
$2$aa$@@a@@2
@x@xa2xx$xxx
22$xax22axa2
他の実装
Clojure の実装もあるようです。
終わりに
Java で NanoID を実装した JNanoId について書きました。
Java で NanoID を使いたい時は、自分で実装しても良いでしょうが、
既に実装されていてテストコードもあるライブラリーを使っても良いのではと思います。