2016-08-04 1 views
1

次の生成されたハッシュは、ハッシュ整数がオーバーフローしないと仮定して、異なるキーに対して常に異なるでしょうか? キーにはASCII文字コードが含まれています。このハッシュ関数は一意ですか?

私は例外的なケースは考えられないので、そうだと思います。

char[] arr = "abcd" 
int hash = 0 
for (int i=0; i<arr.size; i++) { 
    hash += (i+1) * arr[i] 
} 

EDIT1:以下は私の元の質問に技術的に正しい答えですが、私は、キーのドメインが有効な電子メールIDのものであることを言及している必要があります。したがって、いくつかのASCII文字は含まれていません。それにもかかわらず、私はいくつかのテストとレポートを実行します。唯一の問題は、すべてのパーマを列挙することです。

とにかく、私の要件は、電子メールIDに基づいて一意のIDを作成し、dbの主キーとして使用することです。 mail-ids自体を使いたくないだけです。

EDIT2:明らかに、多くの衝突があります。たとえば[email protected]のハッシュ== [email protected]のハッシュ

... 
040 == 012 
041 == 013 
042 == 014 
043 == 015 
044 == 016 
045 == 017 
046 == 018 
047 == 019 
048 == 01: 
... 

私は別のハッシングアルゴリズムが必要です。あなたは何かを提案できますか?

+0

"次の生成されたハッシュは、異なるキーに対して常に異なるでしょうか?" 「ハッシュ関数」の定義により、答えは「いいえ」である。答えが「はい」の場合、ハッシュ関数と呼ばないでください。 –

+0

あなたは大きな値空間を取って、それをより小さな空間に「圧縮」しています。同じ出力にマッピングされる少なくとも2つの入力値が定義されます。 –

+0

少なくとも1つの衝突があるはずです – xdevs23

答えて

4

いいえ:1 * 2 + 2 * 2 = 1 * 4 + 2 * 1などです。

char[] arr = {'\u0002','\u0002'}char[] arr = {'\u0004','\u0001'}

3

これら二つの文字列は、同一のハッシュを生成する:

"~ " 
"@?" 

は、上記の印刷可能なASCII文字で完全に構成されています。

アルゴリズムを強引にテストするには、2文字のすべての組み合わせを試してみてください.3文字または4文字の組み合わせを使用して一意性の考えを試してみてください。

char key[5] = {0}; 
bool used[65536] = {0}; 
for (key[0] = " "; key[0] < 128; key[0]++) 
    for (key[1] = " "; key[1] < 128; key[1]++) { 
     if (used[hashcode(key)]) { 
      printf("failed %s", key); 
     else 
      used[hashcode(key) = true; 
     } 
+0

上記2つの値はそれぞれ190と253を生成します。 – DebD

+0

おっと、申し訳ありません@DebD。私はそれが –

+0

良いキャッチ、@DebDでなければならないと思う。入力する前にASCIIテーブルを慎重にチェックしないと悪いですが、8進値などを読み取っている必要があります。私は2番目のものを "@?"に修正しようとします。間違った "{A" –

0

あなたのハッシュ関数を改善しようとしているについてのあなたの編集にあなたの追加質問に答える、あなたが作ることができる小さな変化が合計に追加する前に、素数で各文字を掛けることであろう。これは衝突がないことを保証するものではありませんが、追加するそれぞれの新しい用語がより多く、そして素数の倍数になるので、それらを減らす必要があります。私はより良い間隔を得るために最初のいくつかの素数をスキップしたいので、最初の文字を11倍、2番目を13倍、3番目を17倍、4番目を19倍などとします。あなたの弦が長すぎない場合、素数の非常に大きなテーブルは必要ありません。

本当に欲しがっていたら、CRCを生成するか、線形フィードバックシフトレジスタ技法を使用してシグネチャを生成することができます。後者では、新しい文字(または新しい文字の選択されたビット)を実行中の合計の下位8ビットに排他的論理和(XOR)し、合計全体をビット数で回転します。

関連する問題