1

この質問のコメントで示唆されているように、私はこれをハッシュ関数として使用しています:

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()同じ結果が得られます。

4

1 に答える 1

4

これは、指定された電話番号が大きすぎて整数に収まらatol()ないため、文字列をうまく変換できないためです。errno呼び出しatol()た後、変換中にエラーが発生していないことを確認してください。
この場合、関数を使用atoll()して電話番号を変換atoll()できます。関数は long long 整数に適合します。

于 2014-10-16T15:22:28.800 に答える