この質問のコメントで示唆されているように、私はこれをハッシュ関数として使用しています:
atol(phone) % buckets
ただし、atol()
すべての電話番号に対してまったく同じ結果が得られました。最初の 2 桁を削除すると (私の場合はすべての数字で同じです)、異なる結果が得られました (もちろん衝突が検出されました..)。
なぜこれが起こったのですか?
この出力を確認します。
printf("%s %ld %ld %s %ld %d %ld\n", str, atol(str), atol(str) % N,
phone, atol(phone), N, atol(phone) % N);
いくつかの例:
48614858 48614858 58 6948614858 2147483647 200 47
61468264 61468264 64 6961468264 2147483647 200 47
54079694 54079694 94 6954079694 2147483647 200 47
48370923 48370923 123 6948370923 2147483647 200 47
52746354 52746354 154 6952746354 2147483647 200 47
メタ質問: より良いハッシュ関数を取得するためのより良いアプローチを提案できる場合、私はまだ自分のコードを変更することにオープンです。
編集:
strtol()
同じ結果が得られます。