Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
uuidはどこまでuuidか試してみた
西日暮里.rb ゴールデンだよLT大会
04/28 2016
山田 雄
ネットビジネス本部
データ基盤T
■山田 雄(ヤマダ ユウ)
株式会社 リクルートライフスタイル
ネットビジネス本部
データ基盤T
Twitter:@nii_yan
Github: https://github.com/yu-yamada
Blog:イクジニアブログ
・元々フリ...
UUID
(User Unique ID)
(Universally Unique Identifier)
普遍的に 唯一の 識別子
こんなことやりたいです
Redshift
実現するためのアーキテクチャ
secor
s4qs-rs
S3
Redshift
データの確認どうやる??
Fluentdから送られてくるメッセージ毎にUUID欲しいです!
俺の作ったpluginちょいと改良すれば出来そうなんでやっておきます!
Qiita: fluentdでメッセージにuuidを追加する方法
http://...
UUIDの実装
require 'securerandom'
SecureRandom.uuid
427037E7-235B-4F6C-9975-15AAC75E56C5
どこまでUUIDか?
427037E7-235B-4F6C-9975-15AAC75E56C5
16進数の32桁なので
単純に考えれば16^32 なので 2^128通り
ようは128bit
どこまでUUIDか?
340澗(かん)通り!!!
(兆,京,垓,抒(じょ),穣(じょう),溝(こう),澗(かん))
ipv6と同じ数
どこまでUUIDか?
Securerandomではuuid version4のuuidを作成
出来る。
RFC4122
version4を使っている場合生成されたIDが他の
IDと衝突する確率は1/2^61。
Version4は128bitのう...
UUIDのバージョン?
バージョン 生成方法
1 MacAddressとタイムスタンプ
2 DEC Security
3 名前のmd5ハッシュ
4 ランダム
5 名前のSHA-1ハッシュ
一応本当に衝突しないか試してみた
require 'securerandom'
aa=Array.new
100000.times do |i|
r=SecureRandom.uuid.upcase
if aa.include?(r)
puts...
一応本当に衝突しないか試してみた
require 'securerandom'
aa=Array.new
100000.times do |i|
r=SecureRandom.uuid.upcase
if aa.include?(r)
puts...
postgres使ってみた
上記のようなテーブルにひたすらuuidを生成して突っ込む。
エラーが出たらuuidが衝突したはず。
name 型 key
uuid text Primary key
行くぜ1000万件
require 'pg'
require 'securerandom'
require 'parallel'
connection = PG::connect(:host => "localhost", :user => ”...
行くぜ1000万件
require 'pg'
require 'securerandom'
require 'parallel'
connection = PG::connect(:host => "localhost", :user => ”...
Aurora使ってみた
name 型 key
uuid string Primary key
Aurora使ってみた
お金が心配で出来なかったです・・・・
name 型 key
uuid string Primary key
Redshiftに入ってるデータ見てみた
2億件ぐらいデータ溜まっていたが衝突
なし
まとめ
Securerandomで生成させるuuidは個人
で検証出来る範囲ではuuidでした!
きっとそれ以上の範囲でもかなりuuidで
す。
ご清聴ありがとうございました
(@nii_yan)
Upcoming SlideShare
Loading in …5
×

Uuidはどこまでuuidか試してみた

5,896 views

Published on

西日暮里.rb ゴールデンだよLT大会 @ 秋葉原UDX!!
山田 雄(株式会社リクルートライフスタイル)

Published in: Technology
  • Be the first to comment

Uuidはどこまでuuidか試してみた

  1. 1. uuidはどこまでuuidか試してみた 西日暮里.rb ゴールデンだよLT大会 04/28 2016 山田 雄 ネットビジネス本部 データ基盤T
  2. 2. ■山田 雄(ヤマダ ユウ) 株式会社 リクルートライフスタイル ネットビジネス本部 データ基盤T Twitter:@nii_yan Github: https://github.com/yu-yamada Blog:イクジニアブログ ・元々フリーランスエンジニア 縁があってリクルートライフスタイルにお世話になることになった。 ビックデータ、Ruby、ビールが好き。 自己紹介
  3. 3. UUID (User Unique ID) (Universally Unique Identifier) 普遍的に 唯一の 識別子
  4. 4. こんなことやりたいです Redshift
  5. 5. 実現するためのアーキテクチャ secor s4qs-rs S3 Redshift
  6. 6. データの確認どうやる?? Fluentdから送られてくるメッセージ毎にUUID欲しいです! 俺の作ったpluginちょいと改良すれば出来そうなんでやっておきます! Qiita: fluentdでメッセージにuuidを追加する方法 http://qiita.com/nii_yan/items/35376464bb26169e4433
  7. 7. UUIDの実装 require 'securerandom' SecureRandom.uuid 427037E7-235B-4F6C-9975-15AAC75E56C5
  8. 8. どこまでUUIDか? 427037E7-235B-4F6C-9975-15AAC75E56C5 16進数の32桁なので 単純に考えれば16^32 なので 2^128通り ようは128bit
  9. 9. どこまでUUIDか? 340澗(かん)通り!!! (兆,京,垓,抒(じょ),穣(じょう),溝(こう),澗(かん)) ipv6と同じ数
  10. 10. どこまでUUIDか? Securerandomではuuid version4のuuidを作成 出来る。 RFC4122 version4を使っている場合生成されたIDが他の IDと衝突する確率は1/2^61。 Version4は128bitのうち6bitは固定 ちなみに宝くじの当たる確率は1/2^24ぐらいらし い・・・
  11. 11. UUIDのバージョン? バージョン 生成方法 1 MacAddressとタイムスタンプ 2 DEC Security 3 名前のmd5ハッシュ 4 ランダム 5 名前のSHA-1ハッシュ
  12. 12. 一応本当に衝突しないか試してみた require 'securerandom' aa=Array.new 100000.times do |i| r=SecureRandom.uuid.upcase if aa.include?(r) puts "find!!" break end aa << r if i % 1000 == 0 puts i end end
  13. 13. 一応本当に衝突しないか試してみた require 'securerandom' aa=Array.new 100000.times do |i| r=SecureRandom.uuid.upcase if aa.include?(r) puts "find!!" break end aa << r if i % 1000 == 0 puts i end end 10万件ぐらいでは全然かぶらず。 そして実行時間が遅い・・・
  14. 14. postgres使ってみた 上記のようなテーブルにひたすらuuidを生成して突っ込む。 エラーが出たらuuidが衝突したはず。 name 型 key uuid text Primary key
  15. 15. 行くぜ1000万件 require 'pg' require 'securerandom' require 'parallel' connection = PG::connect(:host => "localhost", :user => ”XXX", :password => ”XXX", :dbname => ”XXX" ) begin Parallel.each([*1..10000000], in_processes: 4) do |i| r=SecureRandom.uuid.upcase sql = "insert into uuid_test (uuid) values('#{r}')" connection.exec(sql) if i % 10000 == 0 puts i end end rescue => ex puts ex ensure connection.finish end
  16. 16. 行くぜ1000万件 require 'pg' require 'securerandom' require 'parallel' connection = PG::connect(:host => "localhost", :user => ”XXX", :password => ”XXX", :dbname => ”XXX" ) begin Parallel.each([*1..10000000], in_processes: 4) do |i| r=SecureRandom.uuid.upcase sql = "insert into uuid_test (uuid) values('#{r}')" connection.exec(sql) if i % 10000 == 0 puts i end end rescue => ex puts ex ensure connection.finish end 1000万件もそれ以上も余裕だが、 僕のmacが余裕ない・・・ToT (容量やCPU的な意味で)
  17. 17. Aurora使ってみた name 型 key uuid string Primary key
  18. 18. Aurora使ってみた お金が心配で出来なかったです・・・・ name 型 key uuid string Primary key
  19. 19. Redshiftに入ってるデータ見てみた 2億件ぐらいデータ溜まっていたが衝突 なし
  20. 20. まとめ Securerandomで生成させるuuidは個人 で検証出来る範囲ではuuidでした! きっとそれ以上の範囲でもかなりuuidで す。
  21. 21. ご清聴ありがとうございました (@nii_yan)

×