为了账号安全,请及时绑定邮箱和手机立即绑定

字符串的哈希函数

字符串的哈希函数

12345678_0001 2019-07-23 19:07:00
字符串的哈希函数我正在使用C语言编写哈希表,我正在测试字符串的哈希函数。我尝试过的第一个函数是添加ascii代码并使用modulo(%100)但是我在第一次数据测试时得到的结果很差:140个单词的40个冲突。最终的输入数据将包含8 000个单词(它是一个文件中的dictionnary存储)。哈希表声明为int table [10000]并包含txt文件中单词的位置。第一个问题是哪个是散列字符串的最佳算法?以及如何确定哈希表的大小?提前致谢 !
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

首先,您通常希望对哈希表使用加密哈希。根据哈希表标准,加密标准非常快的算法仍然非常慢。

其次,您希望确保输入的每一位都能/将影响结果。一种简单的方法是将当前结果旋转一些位,然后用当前字节对当前哈希码进行异或。重复,直到到达字符串的末尾。请注意,您通常希望旋转为字节大小的偶数倍。

例如,假设8位字节的常见情况,您可以旋转5位:

int hash(char const *input) { 
    int result = 0x55555555;

    while (*input) { 
        result ^= *input++;
        result = rol(result, 5);
    }}

编辑:另请注意,10000个插槽很少是哈希表大小的好选择。您通常需要以下两种方法之一:您要么使用素数作为大小(需要确保某些类型的散列分辨率的正确性),要么需要2的幂(因此可以通过简单的方法将值减小到正确的范围位掩码)。


查看完整回答
反对 回复 2019-07-23
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

对于C,存在许多现有的哈希表实现,从C标准库hcreate / hdestroy / hsearch到APRglib中的那些,它们还提供预构建的哈希函数。我强烈建议使用它们,而不是发明自己的哈希表或哈希函数; 它们已针对常见用例进行了大量优化。

但是,如果您的数据集是静态的,那么您最好的解决方案可能是使用完美的哈希。对于给定的数据集,gperf将为您生成完美的哈希值。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 635 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信