Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hello UUID
Search
mimifuwacc
April 11, 2026
Technology
140
0
Share
Hello UUID
技術系サークル合同新歓2026 Day2
「Hello UUID」発表資料
mimifuwacc
April 11, 2026
More Decks by mimifuwacc
See All by mimifuwacc
RAID6 を楔形文字で組んで現代人を怖がらせましょう(実装編)
mimifuwacc
1
450
Other Decks in Technology
See All in Technology
AI와 협업하는 조직으로의 여정
arawn
0
580
フロントエンドの相手が変わった - AIが加わったWebの新しいインターフェース設計
azukiazusa1
26
6.9k
Modernizing Your HCL Connections Experience: Visual Report to chain, Profile Enhancements, and AI Integration
wannesrams
0
250
巨大プラットフォームを進化させる「第3のROI」
recruitengineers
PRO
2
2.1k
色を視る
yuzneri
0
310
Anthropic「Long-running a gents」をGeminiで再現してみた
tkikuchi
0
760
Shipping AI Agents — Lessons from Production
vvatanabe
0
300
AgentCore Managed Harness を使ってみよう
yakumo
2
290
バイブコーディングで3倍早く⚪⚪を作ってみた
samakada
0
210
Digital Independence: Why, When and How
wannesrams
0
220
社内エンジニア勉強会の醍醐味と苦しみ/tamadev
nishiuma
0
280
ファインディの事業拡大を支える 拡張可能なデータ基盤へのリアーキテクチャ
hiracky16
0
730
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
780
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
How to make the Groovebox
asonas
2
2.1k
Music & Morning Musume
bryan
47
7.2k
Statistics for Hackers
jakevdp
799
230k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Accessibility Awareness
sabderemane
1
110
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
270
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
220
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
280
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.4k
Transcript
Hello UUID 技術系サークル合同新歓2026 Day2 id: mimifuwacc
自己紹介 みみ (id: mimifuwacc) - I 類 学部 4 年
コンピュータサイエンスプログラム - team411 / 工研 (幽霊?) など... - よく書く: TypeScript / Perl - 好き: ヰ世界情緒 / ラノベ / 超かぐや姫!/ Twitter / Linux … - 嫌い: Windows / Microsoft Office / TypeScript
UUID を配っています https://x.com/mimifuwacc/status/2036001613488496885
そもそも UUID って? - UUID (Universally Unique Identifier) とは, ソフトウェア上でオブジェクトを一意に識別する
識別子 - 128ビットの数値だが, 550e8400-e29b-41d4-a716-446655440000 のような表記もできる - 分散システム上での利用を考慮して設計されており,統制なしに作成しても 重複や偶然の一致が事実上おこらない ものとして使用可能 ref. https://ja.wikipedia.org/wiki/UUID
連番じゃダメ? - 分散環境で同時にデータを生成すると,番号が重複する可能性がある - 推測しやすい - c.g. 自分のユーザーIDが 100 なら,次の人は
101 だと簡単に推測できる - マージが大変 - c.g. A社のデータ (ID: 1〜100) と B社のデータ (ID: 1〜100) をマージすると,IDが ぶつかる
UUID なら... 統制なしに作成しても 重複や偶然の一致が事実上おこらないものとして使用可能!
UUIDv4 をつくってみる UUIDv4 の仕様 - 16バイト (128ビット) すべてランダム - 3ブロック目の先頭が「4」
(バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 500f295c-494b-4cf2-bc84-a3f081e13f7d
UUIDv4 をつくってみる UUIDv4 の仕様 - 16バイト (128ビット) すべてランダム - 3ブロック目の先頭が「4」
(バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 500f295c-494b-4cf2-bc84-a3f081e13f7d
UUIDv4 をつくってみる UUIDv4 の仕様 - 16バイト (128ビット) すべてランダム - 3ブロック目の先頭が「4」
(バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 500f295c-494b-4cf2-bc84-a3f081e13f7d
UUIDv4 をつくってみる - 実装する def uuidv4(): raw_bytes = bytearray(os.urandom(16)) raw_bytes[6]
= (raw_bytes[6] & 0x0F) | 0x40 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}"
UUIDv4 をつくってみる - 実装する def uuidv4(): raw_bytes = bytearray(os.urandom(16)) raw_bytes[6]
= (raw_bytes[6] & 0x0F) | 0x40 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 予測不可能な乱数を生成 ref. https://docs.python.org/ja/3/library/os.html#os.urandom
UUIDv4 をつくってみる - 実装する def uuidv4(): raw_bytes = bytearray(os.urandom(16)) raw_bytes[6]
= (raw_bytes[6] & 0x0F) | 0x40 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 0000 1111 0100 0000
UUIDv4 をつくってみる - 実装する def uuidv4(): raw_bytes = bytearray(os.urandom(16)) raw_bytes[6]
= (raw_bytes[6] & 0x0F) | 0x40 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 0011 1111 1000 0000
UUIDv4 をつくってみる - 実装する def uuidv4(): raw_bytes = bytearray(os.urandom(16)) raw_bytes[6]
= (raw_bytes[6] & 0x0F) | 0x40 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}"
UUIDv7 をつくってみる UUIDv7 の仕様 - 先頭6バイト (48ビット) にミリ秒精度のタイムスタンプを格納 → 時間順でソートが可能!
- それ以外はランダム - 3ブロック目の先頭が「7」 (バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 019d78e6-82f7-73df-8182-5a9dbbe7f5c4
UUIDv7 をつくってみる UUIDv7 の仕様 - 先頭6バイト (48ビット) にミリ秒精度のタイムスタンプを格納 → 時間順でソートが可能!
- それ以外はランダム - 3ブロック目の先頭が「7」 (バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 019d78e6-82f7-73df-8182-5a9dbbe7f5c4
UUIDv7 をつくってみる UUIDv7 の仕様 - 先頭6バイト (48ビット) にミリ秒精度のタイムスタンプを格納 → 時間順でソートが可能!
- それ以外はランダム - 3ブロック目の先頭が「7」 (バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 019d78e6-82f7-73df-8182-5a9dbbe7f5c4
UUIDv7 をつくってみる UUIDv7 の仕様 - 先頭6バイト (48ビット) にミリ秒精度のタイムスタンプを格納 → 時間順でソートが可能!
- それ以外はランダム - 3ブロック目の先頭が「7」 (バージョン番号) - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9, a, b のどれか) 019d78e6-82f7-73df-8182-5a9dbbe7f5c4
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = int(time.time_ns() /
1_000_000) random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}"
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = time.time_ns() //
1_000_000 random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" ミリ秒単位で現在時刻を取得
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = time.time_ns() //
1_000_000 random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 6バイトにする
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = time.time_ns() //
1_000_000 random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 0000 1111 0111 0000
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = time.time_ns() //
1_000_000 random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}" 0011 1111 1000 0000
UUIDv7 をつくってみる - 実装する def uuidv7(): timestamp_ms = time.time_ns() //
1_000_000 random_bytes = bytearray(os.urandom(10)) raw_bytes = bytearray(timestamp_ms.to_bytes(6, "big")) raw_bytes.extend(random_bytes) raw_bytes[6] = (raw_bytes[6] & 0x0F) | 0x70 raw_bytes[8] = (raw_bytes[8] & 0x3F) | 0x80 h = raw_bytes.hex() return f"{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}"
覚えておくと便利(?) UUID の仕様 - 3ブロック目の先頭がバージョン番号 - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9,
a, b のどれか) 500f295c-494b-4cf2-bc84-a3f081e13f7d
UUIDv4 あげますよ
8373406a-0b4d-3ff8 -c5cc-c546bccbfd85
8373406a-0b4d-3ff8 -c5cc-c546bccbfd85 v4 なのに「4」じゃない!
8373406a-0b4d-3ff8 -c5cc-c546bccbfd85 v4 なのに「4」じゃない! 「8, 9, a ,b」じゃない!
8373406a-0b4d-3ff8 -c5cc-c546bccbfd85 v4 なのに「4」じゃない! 「8, 9, a ,b」じゃない! 偽物だ!!
覚えておくと便利(?) UUID の仕様 - 3ブロック目の先頭がバージョン番号 - 4ブロック目が「0b10」で始まる (4ブロック目の先頭が 8, 9,
a, b のどれか) 500f295c-494b-4cf2-bc84-a3f081e13f7d
ありがとうございました! - repo: https://github.com/mimifuwacc/uuidgen-py uvx git+https://github.com/mimifuwacc/uuidgen-py id: mimifuwacc Twitter: https://twitter.com/mimifuwacc
- 注意! 実用するときはライブラリを使おう - 手書き UUID をプレゼントします!