UUID と Base32
UUID
- 128ビットの一意な数値
- 文字列では
540d79a1-0d3f-4973-b340-1d4923033768
のような16進数 36文字で表現
Base32
- 32を底とする(1つの文字で 0~31 を表す)
- 5ビットを1文字で表現できる
- 実際には、40ビット単位を8文字に変換する
- 使用するASCII文字により、Base32 と Base32hex がある
Base32 で用いる文字一覧
Table 3: The Base 32 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 9 J 18 S 27 3
1 B 10 K 19 T 28 4
2 C 11 L 20 U 29 5
3 D 12 M 21 V 30 6
4 E 13 N 22 W 31 7
5 F 14 O 23 X
6 G 15 P 24 Y (pad) =
7 H 16 Q 25 Z
8 I 17 R 26 2
Base32hex で用いる文字一覧
Table 4: The "Extended Hex" Base 32 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 0 9 9 18 I 27 R
1 1 10 A 19 J 28 S
2 2 11 B 20 K 29 T
3 3 12 C 21 L 30 U
4 4 13 D 22 M 31 V
5 5 14 E 23 N
6 6 15 F 24 O (pad) =
7 7 16 G 25 P
8 8 17 H 26 Q
UUID を Base32 で表現する
- 128 / 5 = 25.6 なので、26文字で表せる
- Base32自体は40ビット単位のため、160ビット分の文字列となり、6文字分のパディング(=)が付く
python でエンコード/デコード
import base64
import uuid
# ----------
# Base32
# ----------
# UUID を Base32 文字列にする
print(base64.b32encode(uuid.uuid4().bytes)[:26].decode())
# Base32 文字列を UUID にする
a = str(uuid.UUID(bytes=base64.b32decode('KQGXTIINH5EXHM2ADVESGAZXNA' + '======')))
# ----------
# Base32hex
# ----------
# UUID を Base32 文字列にする
print(base64.b32hexencode(uuid.uuid4().bytes)[:26].decode())
# Base32 文字列を UUID にする
a = str(uuid.UUID(bytes=base64.b32hexdecode('AG6NJ88D7T4N7CQ03L4I60PND0' + '======')))
一番小さい値と一番大きい値
- UUID4 で表現するならば、一番小さい値と一番大きい値は次のようにエンコードされる
UUID | Base64 | Base64hex |
---|---|---|
00000000-0000-4000-8000-000000000000 | AAAAAAAAABAABAAAAAAAAAAAAA | 00000000010010000000000000 |
FFFFFFFF-FFFF-4FFF-BFFF-FFFFFFFFFFFF | 7777777775H77P777777777774 | VVVVVVVVVT7VVFVVVVVVVVVVVS |