web-dev-qa-db-ja.com

Java hashCodeとランダムな英語の単語を使用して、ランダムな32ビットキーを生成できますか?

32ビットキーを生成してボブに電話でやり取りしたい。私は彼がたまたま私と同じJavaおよびOSをインストールしていることを知っています。

100,000(英語)単語の辞書があるとします。ランダムに2つの単語をランダムに選んで連結し、hashCode(Word1 + Word2)エントロピーを失うことなくを実行して、同じコードを簡単に生成できるようにできますか?

追加の質問として、64ビットのキーが必要な場合は、4つの単語を選択してキーを連結するhashCode(Word1 + Word2)hashCode(Word3 + Word4)などで単純にできますか? ?

編集:PS:100,0002 > 232 私の数学が正しい場合。

3
Pål GD

短い言葉で:うまく機能しません。

長い言葉で: JavaのString.hashCode()メソッドにはバイアスがあります。実行状態に31を繰り返し乗算し、次に次の文字の数値を加算することで機能します。英語での文字の使用には偏りがあり、文字のグループには偏りがあります。つまり、一部のエントロピーを失います。

おそらく、単語のリストを調べることは非常に奇妙なことです。 100000ワードのリストからランダムなワードを選択するには、0〜99999の範囲の数値を均一に取得する方法が必要です。なぜ、ああ、なぜその値を直接使用しないのですか?なぜ数値を単語に変換し、hashCode()メソッドが数値を直接使用するのではなく、プロセスでエントロピーをあまり失うことなく数値に戻すことを期待しますか?

あなたが0..65535の範囲で均一な整数を生成することができるならば、それで...それはそれだけです。あなたは完全に細かいランダムな16ビット整数を持っています。それらの2つを生成し、そのうちの1つを16ビットだけシフトし、ビット単位のOR(または加算)と組み合わせると、完了です。


Also、32ビットのキーは2つしか持つことができないため、本質的にひどく弱い32 可能な値。その網羅的な列挙は、それほど強力ではないPCにとっては簡単なことです。これらの獣はギガヘルツで時間を数えます。

5
Thomas Pornin