2012-01-04 56 views
1

DJBX33X哈希函数如何在C#中实现?在C.C#中的DJBX33X哈希函数#

uint32_t hash(const char *arKey, uint32_t nKeyLength) 
{ 
    uint32_t hash = 5381; 

    for (; nKeyLength > 0; nKeyLength -=1) 
    { 
     hash = ((hash << 5) + hash)^*arKey++; 
    } 

    return hash; 
} 

这个函数下面是代码修订这里是我到目前为止的代码,但是从C和C#函数的结果是不同的,没有我错过了什么?

public static long hash(string str) 
{   
    long hash = 5381; 

    for (int i = 0; i < str.Length; i++) 
    { 
     hash = ((hash << 5) + hash)^(int)str[i]; 
    } 

    return hash; 
} 

更新2以下为C的outpus和C#

C# 

t = 116(<<172192+177573) -> 177617 
t = 116(<<5683744+5861361) -> 5861253 
u = 117(<<187560096+193421349) -> 193421392 
U = 85(<<6189484544+6382905936) -> 6382905861 
'ttuU' => '6382905861' 

C 

t = 116 (<<172192+177573) -> 177617 
t = 116 (<<5683744+5861361) -> 5861253 
u = 117 (<<187560096+193421349) -> 193421392 
U = 85 (<<1894517248+2087938640) -> 2087938565 
'ttuU' -> '2087938565' 
+1

你尝试过这么远吗?我没有看到任何特别困难的C#完成给定的C代码... – aardvarkk 2012-01-04 15:47:55

回答

2

这是有可能的数据类型是哈希执行很重要;你必须参考文档,一个确切的答案,但是这个函数产生的结果你期待:

public static uint Hash(string str) 
{ 
    uint result = 5381; 

    for (int i = 0; i < str.Length; i++) 
    { 
     result = ((result << 5) + result)^str[i]; 
    } 

    return result; 
} 

输出示例:

Hash("ttuU") -> 2087938565 
+0

是的我认为你是正确的溢出是这个功能设计的一部分。 – 2012-01-06 06:59:39