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

C atol对不同的字符串产生相同的结果,c,hash,std,hash-function,C,Hash,Std,Hash Function,正如问题的评论中所建议的,我将以下内容用作哈希函数: atol(phone) % buckets 然而,对于我所有的电话号码,我从atol()得到了相同的精确结果!我删除了前两个数字(在我的例子中,所有数字都是相同的),得到了不同的结果(当然检测到了碰撞…) 为什么会这样 检查此文件的输出: printf("%s %ld %ld %s %ld %d %ld\n", str, atol(str), atol(str) % N, phone, atol(pho

正如问题的评论中所建议的,我将以下内容用作哈希函数:

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()
给出了相同的结果。

这是因为提供的电话号码太大,无法放入整数,因此,
atol()
无法很好地转换字符串,请在调用
atol()
后检查
errno
,以确保转换过程中不会出现错误。
在这种情况下,您可以尝试使用函数
atol()
来转换电话号码,函数
atol()
可以适应一个长整数。

这是因为提供的电话号码太大,无法适应整数,因此,
atol()
无法很好地转换字符串,请在调用
atol()后检查
errno
以确保在转换过程中不会出现错误。
在这种情况下,您可以尝试使用函数
atol()
来转换电话号码,函数
atol()
可以适合一个长整数。

不使用
strtol()
的具体原因是什么?我考虑过了,但注释建议
atol()
。让我看看。为了适应
6948614858
,您可能需要
strtol()
atol()
任何不使用
strtol()
的具体原因?我考虑过了,但评论建议
atol()
。让我看看。要安装
6948614858
,您可能需要
strtoll()
atol()