0
0

UUID と Base32

Posted at

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0