32ビットキーを生成してボブに電話でやり取りしたい。私は彼がたまたま私と同じJavaおよびOSをインストールしていることを知っています。
100,000(英語)単語の辞書があるとします。ランダムに2つの単語をランダムに選んで連結し、hashCode(Word1 + Word2)
エントロピーを失うことなくを実行して、同じコードを簡単に生成できるようにできますか?
追加の質問として、64ビットのキーが必要な場合は、4つの単語を選択してキーを連結するhashCode(Word1 + Word2)
をhashCode(Word3 + Word4)
などで単純にできますか? ?
編集:PS:100,0002 > 232 私の数学が正しい場合。
短い言葉で:うまく機能しません。
長い言葉で: JavaのString.hashCode()
メソッドにはバイアスがあります。実行状態に31を繰り返し乗算し、次に次の文字の数値を加算することで機能します。英語での文字の使用には偏りがあり、文字のグループには偏りがあります。つまり、一部のエントロピーを失います。
おそらく、単語のリストを調べることは非常に奇妙なことです。 100000ワードのリストからランダムなワードを選択するには、0〜99999の範囲の数値を均一に取得する方法が必要です。なぜ、ああ、なぜその値を直接使用しないのですか?なぜ数値を単語に変換し、hashCode()
メソッドが数値を直接使用するのではなく、プロセスでエントロピーをあまり失うことなく数値に戻すことを期待しますか?
あなたが0..65535の範囲で均一な整数を生成することができるならば、それで...それはそれだけです。あなたは完全に細かいランダムな16ビット整数を持っています。それらの2つを生成し、そのうちの1つを16ビットだけシフトし、ビット単位のOR(または加算)と組み合わせると、完了です。
Also、32ビットのキーは2つしか持つことができないため、本質的にひどく弱い32 可能な値。その網羅的な列挙は、それほど強力ではないPCにとっては簡単なことです。これらの獣はギガヘルツで時間を数えます。