UUID

  • UUIDに関する仕様はRFC 4122で公開されている
    • rfc4122
      • DeepLの翻訳を基にabstractのメモ
      • UUIDは128ビットの長さ
      • version1: 時間ベース
      • version2: DCEで定められたバージョンPOSIX UUIDsに埋め込まれている
      • version3: 名前ベースのバージョン。このドキュメントで定められている。MD5ハッシュ関数を利用
      • version4: ランダムあるいは疑似ランダムに生成されたUUIDのバージョン。このドキュメントで定められている
      • version5: 名前ベースのバージョン。このドキュメントで定められている。SHA-1ハッシュ関数を利用

RubyでUUIDを生成する方法

require 'securerandom'
SecureRandom.uuid
#=> "7bac8e01-9928-4904-bcb4-de3f9e9926d1"

コンピュータは真の乱数を生成できない??

真の乱数とは?

サイコロを繰り返し振って得られるようなでたらめな数のこと。規則性や再現性がなく予測できない。

コンピュータと乱数(ランダムネス)

コンピュータは人間がプログラムしたとおりに動き、それ以外の動作をしない機械だからランダムネスからもっとも遠いと言える。

コンピュータはどうやって乱数を生成しているのか?

  • 疑似乱数を使っている
  • Rubyは簡単に乱数を生成できる
  • Random#randを使用
# Random#rand
irb(main):001:0> foo = Random.new(12345)
#=> #<Random:0x00007fc5d610cdb0>
foo.rand
#=> 0.9296160928171479
foo.rand
#=> 0.3163755545817859

疑似乱数とは?

  • 乱数列の用に見えるが、実際には確定的な計算によって求められている疑似乱数列による乱数
    • 疑似乱数列を生成する機器を疑似乱数列生成器という
    • 生成するアルゴリズムを疑似乱数列生成法という

疑似乱数列生成法(アルゴリズム)について

Rubyではメルセンヌ・ツイスタ(Mersenne Twister)というアルゴリズムによって疑似乱数を生成している。

メルセンヌ・ツイスタ(Mersenne Twister) とは?

  • 1996/97年に開発
  • 従来のさまざまな生成法([* 古典的擬似乱数生成法])の欠点を考慮して設計されている
  • 従来にない長周期、高次元均等分布
  • 生成速度がかなり速い
  • メモリ効率が良い

乱数/疑似乱数と暗号(きっかけだけ)

  • 一般の疑似乱数はその方式と過去の出力が既知であれば、未来の出力を予測可能なので暗号の用途には不適である(暗号学的に安全ではない)
  • 暗号理論では明確な定義が存在する
  • Rubyには module OpenSSL::Random (Ruby 3.1 リファレンスマニュアル) があって暗号論的に安全な乱数を生成できるっぽい,,

Rubyのsecure random と random について

参照

次回のためのキーワード

  • 古典的疑似乱数生成法
  • 古典的疑似乱数生成法の欠点
  • 暗号論的擬似乱数生成機(CSPRNG)