20

私は、ランダムなハッシュを生成する必要がある友人とプロジェクトに取り組んでいます。議論する前に、私たちは異なるアプローチを思いついた.彼らは異なるモジュールを使用しているので、私はあなたに何が良いかを尋ねたかった.

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

また

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

この質問を入力すると、2 番目の方法の方が優れていると思いました。シンプルは複雑よりも優れています。あなたが同意する場合、ハッシュを「ランダムに」生成することについて、これはどの程度信頼できますか? これをどのようにテストしますか?

4

5 に答える 5

40

このソリューション:

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

OSを使用して暗号化の目的で使用できるランダム性を生成するため、これが最適です(OSの実装によって異なります)。

random.random()疑似乱数値を生成します。

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

于 2012-04-26T20:43:03.270 に答える
9

random.random()疑似 radmom ジェネレーターです。つまり、数値はシーケンスから生成されます。を呼び出すとrandom.seed(some_number)、その後、生成されたシーケンスは常に同じになります。

os.urandom()エントロピープールを使用して、通常はハードウェアデバイスからのランダムイベントによって実際の乱数を収集するOSのrngから乱数を取得します。多くの乱数が生成されるシステムには、ランダムな特別なエントロピージェネレーターさえ存在します。

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

したがって、使用は通常、必要なものによって異なります。均等に分散された少数の乱数が必要な場合は、組み込みの prng で十分です。暗号化を使用する場合は、常に実際の乱数を使用することをお勧めします。

于 2012-04-26T20:55:14.573 に答える
7

2 番目のソリューションは明らかに最初のソリューションよりもエントロピーが大きくなっています。ランダム ビットのソースの品質が と で同じであると仮定すると、次のようにos.urandomなりrandom.randomます。

  • 2番目のソリューションでは、16バイト= 128ビット相当のランダム性をフェッチしています
  • 最初のソリューションでは、おおよそ 52 ビットのランダム性を持つ浮動小数点値をフェッチしています (IEEE 754 double、非正規数を無視するなど...)。次に、それをハッシュしますが、もちろん、ランダム性は追加されません。

さらに重要なことに、 からのランダム性の品質は、 からos.urandomのランダム性よりもはるかに優れていることが期待され、文書化されていますrandom.randomos.urandomの docstring は、「暗号化の使用に適している」と述べています。

于 2012-04-26T21:01:39.347 に答える
2

ランダム性のテストは非常に難しいことで有名ですが、2番目の方法を選択しましたが、ハッシュが乱数によってシードされるこの場合にのみ(または頭に浮かぶ限り)のみです。

ハッシュの要点は、入力のわずかな違いに基づいて大幅に異なる数値を作成することです。ユースケースでは、入力のランダム性で十分です。ただし、ファイルをハッシュして1バイトの差を検出したい場合は、ハッシュアルゴリズムが役立ちます。

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

于 2012-04-26T20:47:29.993 に答える
2

一意の識別子(uuid)が必要な場合は、使用する必要があります

import uuid
uuid.uuid4().hex

https://docs.python.org/3/library/uuid.html

于 2016-07-19T16:48:33.127 に答える