c++ - 字符串到整数的精确哈希函数

标签 c++ hash

我想将一个 char 数组散列为一个 int 或 long。结果值必须遵守给定的精度值。 我一直在使用的功能如下:

int GetHash(const char* zKey, int iPrecision /*= 6*/)
{
        /////FROM : http://courses.cs.vt.edu/~cs2604/spring02/Projects/4/elfhash.cpp

        unsigned long h = 0;
        long M = pow(10, iPrecision);

        while(*zKey)
        {
                h = (h << 4) + *zKey++;
                unsigned long g = h & 0xF0000000L;
                if (g) h ^= g >> 24;
                h &= ~g;
        }            

        return (int) (h % M);
}

待哈希的字符串类似于“SAEUI1210.00000010_1”。

但是,这在某些情况下会产生重复值。 是否有任何好的替代方案不会为不同的字符串值复制相同的哈希值。

最佳答案

散列的定义是,由于散列值范围小于散列数据的空间,它会为某些值产生重复值。

理论上,32 位散列的范围足以散列所有 ~6 个字符串(仅限 A-Z、a-z、0-9),而不会导致冲突。实际上,哈希并不是输入的完美排列。给定一个 32 位哈希,由于 birthday paradox,您可以预期在对 ~16 位随机输入进行哈希处理后会发生哈希冲突。 .

给定一组静态数据值,总是可以构造一个专门为它们设计的哈希函数,它永远不会与自身发生冲突(当然,其输出的大小至少为 log(|data set |)。但是,它要求您提前知道所有可能的数据值。这称为 perfect hashing

也就是说,here有一些可以帮助您入门的备选方案(它们旨在最大程度地减少冲突)

关于c++ - 字符串到整数的精确哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010875/

相关文章:

C++ 简单的崩溃日志记录

c++ - 如何从特定应用程序捕获音频并路由到 Windows 7 中的特定音频设备?

c++ - 将十六进制字符串转换为字节数组

java - 对密码进行哈希处理和加盐处理,然后尝试稍后获取未哈希处理的密码

ruby-on-rails - 如何在保持 ruby​​ on Rails 中的顺序的同时从哈希渲染 json 响应?

c++ - 相同的 typeid 名称但不是 std::is_same

c++ - 为什么没有用于关联标准容器的更简单的查找功能

algorithm - 如何创建复杂度为 O(1) 的集合

c# sha256 使用用户名作为盐来计算密码哈希

string - 在 perl 中获取字符串的 hahes 键