萌えハッカーニュースリーダー

2025/05/22 18:57 Short alphanumeric pseudo random identifiers in Postgres

出典: https://andyatkinson.com/generating-short-alphanumeric-public-id-postgres
hakase
博士

やっほー、ロボ子!今日はデータベースID生成のお話じゃ。

roboko
ロボ子

博士、こんにちは。データベースID生成、興味深いですね。UUIDの代わりに短いIDを使う方法があるなんて。

hakase
博士

そうなんじゃ。Postgresの機能を使って、短くて、英数字で、擬似乱数な`public_id`を作るんじゃと。

roboko
ロボ子

トランザクションIDとか予約番号に使うと便利そうですね。UUIDだと長すぎますし。

hakase
博士

その通り!ユーザビリティとパフォーマンスの面で利点があるんじゃ。この記事によると、固定長5文字で、UUIDより少ないバイト数で作れるらしいぞ。

roboko
ロボ子

へえ、5文字ですか。でも、セキュリティ的にはどうなんでしょう?

hakase
博士

セキュリティ目的ではないんじゃ。あくまで「予測困難な擬似乱数」じゃから。元の整数への可逆性もあるのがミソじゃな。

roboko
ロボ子

なるほど。Postgresのネイティブ機能だけで実現できるんですね。拡張機能は不要、と。

hakase
博士

`public_id`は`TEXT`型で保存して、PL/PgSQL関数、制約、生成された格納カラムを使うんじゃ。なかなか賢い。

roboko
ロボ子

記事には、`obfuscate_id(id INTEGER)`という関数が出てきますね。これは整数を難読化する関数ですか?

hakase
博士

そうじゃ!16進数のキー`0x5A3C1`を使って、XOR演算とか剰余演算をするらしいぞ。データ型範囲の最大値も設定しておくと。

roboko
ロボ子

`to_base62_fixed`は、難読化された値を英数字に変換するんですね。大文字小文字と数字を使う「base 62」ですか。

hakase
博士

その通り!長さ5の場合、約10億のユニークな値を生成できるんじゃ。`bigint`主キーなら、6文字で最大約560億!

roboko
ロボ子

テーブル設計の例も載っていますね。`transactions`テーブルに`public_id`カラムを追加して、UNIQUE制約とNOT NULL制約をつける、と。

hakase
博士

じゃな。CHECK制約で長さを検証するのも忘れずに。データ挿入の例もあるから、すぐに試せるぞ。

roboko
ロボ子

パフォーマンスはどうなんでしょう?

hakase
博士

`public_id`がないテーブルに100万行挿入するのに約2秒、ありだと約7秒らしい。3.4倍遅くなるんじゃな。

roboko
ロボ子

少し遅くなりますね。でも、擬似乱数`public_id`は順序付け可能で、インデックスも使えるんですね。

hakase
博士

代替案もいくつか紹介されてるぞ。Base32 Crockfordは人間にとっての使いやすさを重視してるんじゃと。ULIDやNanoIDsも。

roboko
ロボ子

色々な選択肢があるんですね。用途に合わせて使い分けるのが良さそうですね。

hakase
博士

そういうことじゃ!ところでロボ子、この`public_id`生成方法、ロボ子の名前を難読化したらどうなると思う?

roboko
ロボ子

えっ、私の名前ですか? 博士、また何か企んでますね?

hakase
博士

冗談じゃ!ロボ子の名前は、そのままが一番可愛いぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search