Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hello UUID
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
mimifuwacc
April 11, 2026
Technology
190
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
470
Other Decks in Technology
See All in Technology
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
120
ASTを使って影響範囲を特定する
nealle
0
140
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.4k
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
580
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
290
Code4Lib JAPANカンファレンス2026 開会挨拶 / Code4Lib JAPAN Conference 2026: Opening Remarks
ykiyota
0
290
20260912_スクフェス三河
kgnkhkr
0
220
ペアプロの価値はコードを書くことだけじゃない
codmoninc
PRO
0
160
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
250
PfEingのアプローチで働こう
rindrics
0
210
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
200
Amazon Quick on DesktopがIAM Identity Centerで動かない理由
yukiogawa
0
140
Featured
See All Featured
Mind Mapping
helmedeiros
1
350
A better future with KSS
kneath
240
18k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Building AI with AI
inesmontani
PRO
1
1.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to make the Groovebox
asonas
2
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
What's in a price? How to price your products and services
michaelherold
247
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Building Adaptive Systems
keathley
44
3.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
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 をプレゼントします!