6

コードは必要ありません (必要に応じてコードで例を提供できます) が、理論は必要です。

次の関数があるとしましょう。

UINT GenerateID(const char * string);

関数の結果が完全にランダムに見えるようにしたいと思います。ユニークであることは不可能であることは理解していますが、それが私の欲求を説明できる最良の方法です.

GenerateID("123"); //Could result in 999
GenerateID("123"); //Must also result in 999
GenerateID("124"); //Should result in something completely different

これを自分で試してみると、結果は常にほぼ同じ桁数になります。

4

3 に答える 3

4

std::hash を調べましたか?

http://en.cppreference.com/w/cpp/utility/hash

于 2013-04-15T18:13:05.850 に答える
1

これはできません。int議論のために、あなたが32ビットであると仮定します。テキスト文字列は' 'a-zA-Zおよび0-9半ダースの句読点文字で構成され、合計で約 1 + 2*26 + 10 + 6 = 69 文字になります。6 文字の文字列の場合、整数値よりも多くの文字列を使用できます (log(2^32)/log(69) = 5.23)。64 ビットを使用long longし、11 文字で使い果たしました。

他の回答が言うように、ハッシュ関数を使用することができます(多くのものが浮かんでいます)。これは、文字列を整数にマップし、(うまくいけば) 選択した整数の範囲に均等に分散します。

完全なハッシュ関数を構築するテクニックがあります。これは、文字列の固定セットに対して関数を作成し、衝突がないことを保証するあまり大きくない範囲です (2 つの文字列が同じ整数を与えることはありません)。

これがプログラムで使用され、攻撃者が文字列を制御できる場合、アルゴリズムの複雑さによる攻撃を受けることになります(攻撃者は衝突する文字列であなたを圧倒する可能性があります)。

于 2013-04-15T19:04:57.323 に答える