0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python in Excel】UUID (GUID) と ULID の採番方法

Posted at

【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 つの部分から構成されます:

  1. 48ビットのタイムスタンプ(ミリ秒単位、時系列順にソート可能)
  2. 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
0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?