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
110
0
Share
Hello UUID
技術系サークル合同新歓2026 Day2
「Hello UUID」発表資料
mimifuwacc
April 11, 2026
More Decks by mimifuwacc
See All by mimifuwacc
RAID6 を楔形文字で組んで現代人を怖がらせましょう(実装編)
mimifuwacc
1
440
Other Decks in Technology
See All in Technology
OCI技術資料 : 証明書サービス概要
ocise
1
7.2k
AIを活用したアクセシビリティ改善フロー
degudegu2510
1
150
Babylon.js Japan Activities (2026/4)
limes2018
0
180
GitHub Copilotを極める会 - 開発者のための活用術
findy_eventslides
5
2.8k
プロダクトを触って語って理解する、チーム横断バグバッシュのすすめ / 20260411 Naoki Takahashi
shift_evolve
PRO
0
120
Babylon.js を使って試した色々な内容 / Various things I tried using Babylon.js / Babylon.js 勉強会 vol.5
you
PRO
0
240
JSTQB Expert Levelシラバス「テストマネジメント」日本語版のご紹介
ymty
0
130
ログ基盤・プラグイン・ダッシュボード、全部整えた。でも最後は人だった。
makikub
3
300
AIにより大幅に強化された AWS Transform Customを触ってみる
0air
0
310
最大のアウトプット術は問題を作ること
ryoaccount
0
300
ハーネスエンジニアリング×AI適応開発
aictokamiya
3
1.5k
レガシーシステムをどう次世代に受け継ぐか
tachiiri
0
270
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
160
エンジニアに許された特別な時間の終わり
watany
106
240k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
500
Scaling GitHub
holman
464
140k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
120
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
170
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
120
Mind Mapping
helmedeiros
PRO
1
140
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
670
Chasing Engaging Ingredients in Design
codingconduct
0
160
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 をプレゼントします!