Closed16

UUID / CUID / nanoid とか乱数の話

uuid: 広く知られたunique生成。hex形式で長い

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と同程度の表現を持つと言えそう

9000桁ぐらいで1割ぐらい差が出る

base-10 9001
base-32 5980
base-58 5104
base-62 5022
base-64 4983
base-67 4929

結論:乱数ならshort-uuidが良さそう。

このスクラップは2021/01/16にクローズされました
ログインするとコメントできます