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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mimifuwacc
April 11, 2026
Technology
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hello UUID
技術系サークル合同新歓2026 Day2
「Hello UUID」発表資料
mimifuwacc
April 11, 2026
More Decks by mimifuwacc
See All by mimifuwacc
RAID6 を楔形文字で組んで現代人を怖がらせましょう(実装編)
mimifuwacc
1
460
Other Decks in Technology
See All in Technology
Cursor Meetup Sapporo - Cursor物語 続編
cocacola917
0
110
AIは実装を速くする。では、私たちは何を今作るべきか?-立場を越えてリリースに向き合ったチーム開発の実践 / 20260801 Hiromi Nakaya and Naoki Takahashi
shift_evolve
PRO
3
350
名古屋の市バスGTFS-JPデータ×スガキヤ 最寄りバス停検索をAmazon ElastiCache Serverless for Valkeyで最適化する
usanchuu
1
210
Amazon Bedrock Managed Knowledge BaseDive Deep
ren8k
0
380
AIQAのナレッジ構築について
qatonchan
1
150
侵入は突然に 〜 IoTマルウェアと悪用される家庭の機器 ~ / When Intrusion Strikes: IoT Malware and the Abuse of Home Devices
nttcom
0
1.4k
PLaMo 3.0 Primeの事後学習
pfn
PRO
0
270
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
750
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
5
950
QAと開発の両側から進める AI活用 -QAプロセスAI支援ツールキットと Inner Loop / Outer Loopの取り組み-
legalontechnologies
PRO
2
430
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
140
運用を犠牲にせずコストを制御し事業成長を支える B2B SaaS ID管理基盤におけるS3 Tableのログストレージ活用
kaminashi
1
360
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
240
YesSQL, Process and Tooling at Scale
rocio
174
15k
Documentation Writing (for coders)
carmenintech
77
5.4k
Un-Boring Meetings
codingconduct
0
360
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
360
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
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 をプレゼントします!