2008-08-19 10 views

答えて

4

あなたはほとんど変化せずにCのコードを実行できます。

uint sdbm(string str) 
{ 
    uint hash = 0; 
    foreach(char ch in str) 
    { 
     hash = ch + (hash << 6) + (hash << 16) - hash; 
    } 
    return hash; 
} 

それとも、より洗練された何かを考えましたか?

私はCコンパイラはので、私はそれは同じことを実行かどうかを確認するためにテストすることはできません設定されていないが、私は次は正しいと思い
1

private static ulong SBDM(string str) 
{ 
    ulong hash = 0; 

    foreach (char c in str) 
    { 
     hash = c + (hash << 6) + (hash << 16) - hash; 
    } 

    return hash; 
} 

あなただけが必要な場合文字列のハッシュを取得し、実装が何であるかはそれほど重要ではありません。常にString.GetHashCode()を実行できます。

0

ハッシュの結果は、C++実装とC#実装で異なります。私はstrパラメータをバイト配列として渡す必要があることを理解しました。

private uint sdbm(byte[] str) 
{ 
    uint hash = 0; 

    foreach (char ch in str) 
     hash = ch + (hash << 6) + (hash << 16) - hash; 

    return hash; 
} 

このメソッドを呼び出すには、BitConverter.GetBytesメソッドでハッシュする値を変換します。

uint Hash = sdbm(BitConverter.GetBytes(myID)); 
関連する問題