Closed16
UUID / CUID / nanoid とか乱数の話
uuid: 広く知られたunique生成。hex形式で長い
nanoidをカスタマイズしたときの衝突率
cuid
-
https://github.com/ericelliott/cuid
nanoidよりはtrend低そう。
結構内部処理はnanoidより色々やってそう
nanoidもcuidも18言語ぐらいで実装してるっぽい
単純にunixtimeを圧縮したいとしたら? -> base64とかで良い。
でもbase64は記号が入ってて邪魔 -> base62とかbase58
const PowerRadix = require("power-radix")
const bases = [
"0123456789",
"0123456789ABCDEFGHJKMNPQRSTVWXYZ",
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~",
]
const orders = [...Array(10).keys()]
orders.map(order => {
const o = order * 10
console.log(`order: ${o + 1}`)
const target = `1${[...Array(o )].map(i => 0).join("")}`
bases.map((chars) => {
const pw = new PowerRadix(target, "0123456789".split(""))
const baseX = pw.toString(chars.split(""))
console.log(`base-${chars.length}`, baseX.length) , baseX)
})
})
結果
order: 1
base-10 1 1
base-16 1 1
base-32 1 1
base-58 1 2
base-62 1 1
base-64 1 B
base-67 1 B
order: 11
base-10 11 10000000000
base-16 9 2540BE400
base-32 7 9A0QS00
base-58 6 GEfcc7
base-62 6 aUKYOA
base-64 6 JUC+QA
base-67 6 HbQzqX
order: 21
base-10 21 100000000000000000000
base-16 17 56BC75E2D63100000
base-32 14 2PQHTY5NHH0000
base-58 12 518CApsYbVFd
base-62 12 1V973MbJYWoU
base-64 12 BWvHXi1jEAAA
base-67 11 25nYsMk4z_8
order: 31
base-10 31 1000000000000000000000000000000
base-16 25 C9F2C9CD04674EDEA40000000
base-32 20 S7SCKK84CX7DX9000000
base-58 18 23yZ3FjLH69ECn2UEj
base-62 17 kYxECrApQZVJq8bCw
base-64 17 Mnyyc0EZ07epAAAAA
base-67 17 GEWDfe8tZ3RDPBlko
order: 41
base-10 41 10000000000000000000000000000000000000000
base-16 34 1D6329F1C35CA4BFABB9F5610000000000
base-32 27 7B357RW6Q54QYNVKXB100000000
base-58 23 H1zZFLVfnEXMCfeoG4PPSmM
base-62 23 3GY0rySV2cQYHLd8dWv8MaA
base-64 23 B1jKfHDXKS/q7n1YQAAAAAA
base-67 22 s9l.FVRR9ZbWzfQqomgSqx
unixtimeが10桁。mill秒だとしてプラス4桁。あとは重複防止にカウンタなりペイロードなりせいぜい6桁足して20桁程度の数値を表せば良い場合であればbase58はbase64と同程度の表現を持つと言えそう
base32, base64, base64urlはRFCがあるらしい
9000桁ぐらいで1割ぐらい差が出る
base-10 9001
base-32 5980
base-58 5104
base-62 5022
base-64 4983
base-67 4929
トレンド的には若干base62のほうが優勢?
flicker base58ベース。
uuid-baseXX系。base62が一番人気
全体で見ればnanoidが圧勝な感じ。short-uuidも割と頑張ってる
結論:乱数ならshort-uuidが良さそう。
python
このスクラップは2021/01/16にクローズされました