字符串到整数散列函数与精密(String to Integer Hashing Function w

2019-06-23 13:19发布

我想为int或长哈希字符数组。 结果值一直坚持以给定的精度值。 我一直在使用的功能下面给出:

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”。

然而,这将产生在某些情况下重复的值。 是否有这将不会重复针对不同的字符串值相同的哈希什么好的办法。

Answer 1:

散列的非常定义是,它对于一些值产生重复的值,由于散列值范围大于所述散列数据的空间更小。

从理论上讲,一个32位的散列具有足够的范围以哈希所有〜6字符串(AZ,AZ,0-9只),而不会引起冲突。 在实践中,哈希值是不是输入的完美排列。 给定一个32位的哈希值,你可以期望散列〜16位的随机输入,由于后获得哈希碰撞生日悖论 。

给定一组静态数据值,它总是可以构建一个哈希函数专门为他们设计的,它绝不会与自身(当然碰撞时,其输出的规模将至少log(|data set|)然而,要求您知道所有可能的数据值的时间提前,这被称为完美的哈希 。

话虽这么说, 这里是应该让你开始这几个备选方案(他们的目的是尽量减少碰撞)



Answer 2:

每个哈希会有冲突。 期。 这就是所谓的一个生日问题 。

您可能要检查的密码有一个像MD5函数(比较快,你不关心它是不安全的),但它也会有冲突。



Answer 3:

哈希生成不同的输入相同的值 - 这就是他们做什么。 所有你能做的就是创造足够的分布或位深度(或两者),以尽量减少这些冲突的哈希函数。 既然你有这个精度附加约束(0-5?),那么你会更经常打的碰撞。



Answer 4:

MD5或SHA 。 有很多开放的实施,其结果是不太可能产生重复的结果。



文章来源: String to Integer Hashing Function with Precision
标签: c++ hash