Open2
uuid58の可変長・固定長で実際にどれくらいサイズが削減されるのか調べる
実際に計測1億回計算してみると
import { uuid58 } from "./index.ts";
const hist = new Map<number, number>();
for (let i = 0; i < 100000000; i++) {
const uuid = uuid58();
const len = uuid.length;
hist.set(len, (hist.get(len) ?? 0) + 1);
}
console.log(hist);
console.log(
1 - hist.entries().map(([len, count]) => {
return len * count;
}).reduce((a, b) => a + b, 0) / (22 * 100000000),
);
deno hist.ts
Map(5) {
22 => 96835085,
21 => 3110272,
20 => 53680,
19 => 949,
18 => 14
}
0.0014638795454545717
パディングなしのuuid58が22文字になる確率は、先頭に1
という文字がいくつ続くかで決まる。
1
が0個の確率は
1
が1個の確率は
1
が2個の確率は
...
1
がn個の確率は
期待される文字数は
一方パディングありのuuid58の期待される文字数は常に22文字なので、
よって削減率は
実測値の半分くらいなのは、22桁の58進数で表現できる情報量がUUIDの128bitよりも若干多く、先頭にパディングの1
が来る確率が完全なランダムよりも若干高いため。