Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将DJB哈希转换为64位_C++_C_Hash - Fatal编程技术网

C++ 将DJB哈希转换为64位

C++ 将DJB哈希转换为64位,c++,c,hash,C++,C,Hash,如果我使用的是64位无符号整数,Dan Bernstein的哈希函数还能正常工作吗 uint64 hash_djb2(register uchar *str, register size_t length) { register uint64 hash = 5381L; while (length--) { hash = ((hash << 5L) + hash) + *str++; /* hash * 33 + c */ } retu

如果我使用的是64位无符号整数,Dan Bernstein的哈希函数还能正常工作吗

uint64
hash_djb2(register uchar *str, register size_t length) {
    register uint64 hash = 5381L;
    while (length--) {
        hash = ((hash << 5L) + hash) + *str++; /* hash * 33 + c */
    }
    return hash;
}
uint64
hash_djb2(寄存器uchar*str,寄存器大小\u t长度){
寄存器uint64散列=5381L;
while(长度--){

散列=((哈希我不知道所有2^64可能值的分布是否与32位版本相同,但有一个重要属性仍然有效。乘法器
33
与2^64不共享任何公约数。因此,哈希中运行的所有字符仍将对最终结果产生影响。换句话说这两个字符串的哈希结果将不同:

hash("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") => 0x87b2af4e3d92de7a
hash("baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") => 0xd496edbee1219cfb

它应该仍然是一个有用的散列函数。当然,我忍不住想知道为什么需要这么大的散列值。一个非常大的散列表?或者其他用途?

djb散列函数基于a,其形式为x=(a·x+c)mod m

通过检查函数,我们意识到在djb的情况下,
a=33
c=input
,但模是位隐藏的,因为它是由变量hash的类型表示的,该变量的原始形式为无符号长,包含32位数据。当值超过无符号长的值时,它会溢出ows和continues,因此是2^32的模

根据Knuth在其《计算机编程艺术》(第2卷:第3.2.1章的半数值算法)中所述,m必须可被(a-1)的所有素数因子整除,线性同余生成器才具有最大周期(周期=模)(以及Bernstein先生已经考虑的其他事实)由于具有
m=2^64
不会引入新的素数因子,因为根据定义
2
2^32
2^64
的素数,因此满足此规则

然后,使用这个新的散列算法,可以得到与模一样长的周期,这意味着您将覆盖64位整数的所有可能值


请记住,改变算法的任何数学值都不是轻而易举的事。需要进行全新的统计分析,以充分了解新算法的缺陷和优点,即使你只改变了其中的一个变量。你不能简单地改变值,希望得到与原算法相同的特性inear同余生成器。前一种算法不会保留熵和碰撞等统计特征。因此,您不能声称实现了djb算法,也不能引用djb的任何统计性能来证明您的实现。

我正在制作一个可以运行的哈希表超过40亿行(不太可能,但有可能)…此外,碰撞可能性较低也不错…@Ian:谢谢你满足了我的好奇心。听起来你会突破一些界限;这些可能是很好的项目类型。