atol为不同的字符串产生相同的结果

时间:2014-10-16 15:09:35

标签: c hash std hash-function

正如this问题的评论中所建议的那样,我使用的是哈希函数:

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()会得到相同的结果。

1 个答案:

答案 0 :(得分:4)

因为提供的电话号码太大而无法容纳整数,因此atol()无法很好地转换字符串,请在致电errno后检查atol()确保在转换过程中没有错误发生。
在这种情况下,您可以尝试使用函数atoll()来转换电话号码,函数atoll()可以适应很长的时间整数。