2012-04-26 27 views
15

私はランダムなハッシュを生成する必要がある、友人とプロジェクトに取り組んでいます。私たちが議論する時間がなくなる前に、私たちはどちらも異なったアプローチを思いつきました。異なるモジュールを使用しているので、私はあなたに何が良いかを尋ねたがっていました。この質問を入力するランダム、ハッシュライブラリ、またはランダムなものは何ですか?

hashlib.sha1(str(random.random())).hexdigest() 

または

os.urandom(16).encode('hex') 

は、第二の方法が優れていることを考えて、私を持っています。シンプルは複合体より優れています。あなたが同意するならば、これは無作為にハッシュを生成するための信頼性はどれくらいですか?どのように私はこれをテストするだろうか?

答えて

36

このソリューション:それはuses the OS暗号化の目的のために使用可能である(OSの実装に依存)すべきランダム性を生成するため、

os.urandom(16).encode('hex') 

は最高です。

random.random()は、pseudo-random valuesを生成します。

ランダム値をハッシュしても、新しいランダム性は追加されません。

+0

を使用する必要があります。ありがとうございました。 – Flowpoke

+0

AttributeError: 'bytes'オブジェクトに 'エンコード'属性がありません – treecoder

+0

@greengit:上の小さなスニペットはPython 2.xバージョン(3.xではテストされていません)を対象としている可能性が非常に高い – ChristopheD

2

ランダム性のテストは難しいですが、私は2番目の方法を選択しましたが、この場合はハッシュに乱数を掛けただけです(または、限り)。ハッシュの

全体のポイントは、入力でわずかな違いに基づいて大幅に異なる番号を作成することです。あなたのユースケースでは、入力のランダム性が必要です。しかし、ファイルをハッシュし、1バイトの違いを検出したい場合は、ハッシュアルゴリズムが輝いています。

私はちょっと不思議ですが、なぜハッシュアルゴリズムを使うのですか?純粋に乱数を探しているようですが、uuidを生成するライブラリがたくさんあります。乱数ジェネレータよりも一意性がはるかに強く保証されています。

7

random.random()は疑似ラドモームジェネレータであり、数字はシーケンスから生成されることを意味します。 random.seed(some_number)を呼び出すと、生成されたシーケンスは常に同じになります。

os.urandom() getは、通常、ハードウェアデバイスからのランダムイベントによってエントロピープールを使用してエントロピープールを使用する乱数です。ランダムな数が多いシステムの場合は、ランダムな特殊エントロピージェネレータも存在します。生成される。

unixシステムでは、伝統的に2つの乱数ジェネレータがあります:/dev/random/dev/urandomです。 /dev/urandomを読み込み、利用可能なエントロピーデータが十分でない場合は、疑似乱数を使用してブロックされませんが、利用可能なエントロピーが十分でない場合は最初のブロックを呼び出します。

ですので、通常は必要なものに依存します。いくつかの等しく分布する乱数が必要な場合は、組み込みのprngで十分です。暗号の使用のためには、常に実際の乱数を使用する方が良い。

7

第2の解決策は明らかに第1の解決策より多くのエントロピーを有する。ランダムビットのソースの品質と仮定するとos.urandomrandom.randomために同じである:あなたがフェッチされた第1溶液にランダム

  • の価値は16バイト= 128ビットをフェッチしている第二の溶液で

    • 約52ビットのランダム性を持つ浮動小数点値(IEEE 754倍精度、非正規数を無視するなど)。それからあなたはそれをハッシュします。もちろん、それはランダム性を追加しません。さらに重要なこと

    os.urandomからの乱数の品質がrandom.randomからランダムよりもはるかに優れていることが予想され、文書化されています。 os.urandomのdocstringは "暗号の使用に適しています"と言います。

  • 関連する問題