1

正如这个问题的评论中所建议的,我将其用作哈希函数:

atol(phone) % buckets

atol()但是,我所有的电话号码都得到了相同的结果!我删除了前两位数字(在我的情况下,它们对于所有数字都是相同的)并得到不同的结果(当然检测到碰撞......)。

为什么会这样?

检查这个的输出:

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()可以适合一个长整型。

于 2014-10-16T15:22:28.800 回答