C#中的DJBX33X哈希函数

时间:2012-01-04 15:42:44

标签: c# hash

如何在C#中实现DJBX33X哈希函数?以下是C中此功能的代码。

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和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 个答案:

答案 0 :(得分: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