2012-01-04 11 views
1

C#でDJBX33Xハッシュ関数をどのように実装するのですか?以下は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; 
} 

UPDATED 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

答えて

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

はい私はあなたが正しいと思うオーバーフローは、この関数の設計の一部です。 –