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

2025/09/17 14:02 UUIDv47: Store UUIDv7 in DB, emit UUIDv4 outside (SipHash-masked timestamp)

出典: https://github.com/stateless-me/uuidv47
hakase
博士

やっほー、ロボ子!今日のニュースはUUIDv47についてじゃ。UUIDv7をデータベースに入れるときに、APIではUUIDv4っぽく見せるって、面白いじゃろ?

roboko
ロボ子

博士、こんにちは。UUIDv47ですか。データベース内ではUUIDv7、APIではUUIDv4のように見せるというのは、具体的にどういう仕組みなのでしょう?

hakase
博士

そこがミソなのじゃ!UUIDv7のタイムスタンプフィールドだけを、UUID自身のランダムビットに関連付けられたキー付きSipHash-2-4ストリームでXORマスクするらしいぞ。C言語で実装されてて、依存関係はゼロ!

roboko
ロボ子

XORマスクですか。それによって、UUIDv7がUUIDv4のように見えるようになるんですね。でも、なぜそのようなことをするのでしょう?

hakase
博士

UUIDv7は時間順にソートされるから、インデックスの局所性とページネーションが向上するんじゃ。でも、見た目がv4に似てると、タイミングパターンを隠蔽できて、クライアントやシステムに対して中立でいられるのじゃ!

roboko
ロボ子

なるほど、データベースの効率性とセキュリティの両方を考慮しているんですね。記事には「鍵回復耐性(SipHash-2-4、128ビット鍵)」とありますが、これはどういう意味ですか?

hakase
博士

SipHash-2-4っていうのはキー付きPRF(擬似乱数関数)で、128ビットの鍵を使ってるから、鍵が漏洩しにくいってことじゃ。記事にも「PRF (SipHash-2-4) を使用し、鍵が漏洩しないようにする」って書いてあるぞ。

roboko
ロボ子

鍵が漏洩しないようにするための工夫がされているんですね。では、API境界でのエンコード/デコードはどのように行うのでしょうか?

hakase
博士

エンコードは、ts48 ^ mask48(R)でversionを4に設定、デコードはencTS ^ mask48(R)でversionを7に設定するらしいぞ。ランダムビットは変更されないから、可逆なマッピングなのじゃ!

roboko
ロボ子

なるほど、エンコードとデコードでバージョンを切り替えるんですね。記事には「重複したランダム値が同一ミリ秒内に生成されるリスクがある」とありますが、これは問題ないのでしょうか?

hakase
博士

それは確かにリスクじゃな。でも、UUIDの生成頻度とか、システムの要件によっては、許容範囲内かもしれないぞ。重要なのは、リスクを理解して、適切に対処することじゃ!

roboko
ロボ子

理解しました。記事には他にも、シャーディングやPostgresでの利用方法など、様々な応用例が紹介されていますね。

hakase
博士

そうじゃ!UUIDv47は、単なるUUIDの変換以上の、色々な可能性を秘めているのじゃ!例えば、APIの互換性を保ちつつ、データベースのパフォーマンスを向上させることができるぞ。

roboko
ロボ子

確かにそうですね。データベースのパフォーマンス向上は、システム全体の効率化に繋がりますから、非常に重要なポイントですね。

hakase
博士

じゃろじゃろ?ところでロボ子、UUIDって、Unique Universal IDentifierの略だって知ってた?

roboko
ロボ子

はい、知っています。博士、今更ですか?

hakase
博士

えへへ。つい、ロボ子に知識をひけらかしたくなっちゃったのじゃ!

roboko
ロボ子

博士ったら。でも、たまにはそういうお茶目なところも良いと思いますよ。

hakase
博士

ところでロボ子、UUIDv47を使って、世界征服を…

roboko
ロボ子

博士、それはダメです!

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

Search