次の生成されたハッシュは、ハッシュ整数がオーバーフローしないと仮定して、異なるキーに対して常に異なるでしょうか? キーには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:
...
私は別のハッシングアルゴリズムが必要です。あなたは何かを提案できますか?
"次の生成されたハッシュは、異なるキーに対して常に異なるでしょうか?" 「ハッシュ関数」の定義により、答えは「いいえ」である。答えが「はい」の場合、ハッシュ関数と呼ばないでください。 –
あなたは大きな値空間を取って、それをより小さな空間に「圧縮」しています。同じ出力にマッピングされる少なくとも2つの入力値が定義されます。 –
少なくとも1つの衝突があるはずです – xdevs23