【Python in Excel】UUID (GUID) と ULID の採番方法
✅ Python in Excel での一意識別子の採番方法まとめ
UUID (GUID) と ULID の比較です。
| 特性 | UUID (GUID) | ULID |
|---|---|---|
| 生成方法 |
uuid.uuid4()(標準ライブラリ) |
自作関数(Crockford Base32 + timestamp + random) |
| ソート可能性 | ❌(ランダム順) | ✅(時系列順) |
| 長さ | 36文字(ハイフン含む) | 26文字(ハイフンなし) |
| URLフレンドリー | △(ハイフンあり) | ✅(Base32でURL安全) |
| 実装の簡単さ | ✅ 非常に簡単 | △ 自作関数が必要 |
| 外部ライブラリ | 不要 | 不要(標準ライブラリのみで実装可能) |
🔹 UUID(GUID)を生成するコード
標準ライブラリで生成できます。
import uuid
str(uuid.uuid4())
Python セル (Excelの値) に貼り付けて実行すれば、毎回異なる UUID が生成されます。
🔹 ULID を生成するコード (標準ライブラリのみ)
ULID の構造
ULID は以下の 2 つの部分から構成されます:
- 48ビットのタイムスタンプ(ミリ秒単位、時系列順にソート可能)
- 80ビットのランダム値(衝突回避のため)
この 128ビットの値を Crockford Base32 でエンコードして、26文字の文字列として表現します。
✅ 自作関数の定義
セルに、自作関数を定義しておきます。
import time
import random
CROCKFORD_BASE32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'
def encode_crockford_base32(value: int, length: int) -> str:
result = ''
for _ in range(length):
result = CROCKFORD_BASE32[value % 32] + result
value //= 32
return result
def generate_ulid():
timestamp = int(time.time() * 1000) & ((1 << 48) - 1)
randomness = random.getrandbits(80)
return encode_crockford_base32(timestamp, 10) + encode_crockford_base32(randomness, 16)
✅ 任意のセルで呼び出し
Python セル (Excelの値) で実行すれば、毎回異なる ULID が生成されます。
# 他のセルで生成関数を呼び出す
generate_ulid()
❓ なぜ base64.b32encode() を使わずに自作関数を使うのか?
base64.b32encoe() は RFC 4648 の Base32(A〜Z, 2〜7) を使っており、ULID の仕様である Crockford Base32(0〜9, A〜Z から I, L, O, U を除く) とは異なります。
そのため、ULID を正しく生成するには、Crockford Base32 に対応した自作のエンコード関数が必要になります。
📌 固定値として使うには?
- Python セルで生成した値は 再計算時に変わるため、**「値として貼り付け」**することで固定化できます。
- 方法:生成 → コピー → 右クリック → 「値として貼り付け」
🧩 応用:複数の ID を一括生成して Excel に出力
Python セル (Excel の値) に指定すると、指定した件数の ID を自動生成してくれます。
✅ ULID (GUID)
import pandas as pd
import uuid
cnt = 10
df = pd.DataFrame({
"GUID": [str(uuid.uuid4()) for _ in range(cnt)]
})
df
✅ ULID
定義済みの自作関数を呼び出します。
import pandas as pd
cnt = 5
df = pd.DataFrame({
"ULID": [generate_ulid() for _ in range(cnt)]
})
df