3

sdbmハッシュ関数(このようなをC#でどのように実装できますか?

4

3 に答える 3

3

ほとんど変更なしでCコードを取得できます。

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

それとももっと洗練されたものを考えましたか?

于 2008-08-19T10:52:35.800 に答える
1

私はCコンパイラを設定していないので、同じように動作するかどうかをテストすることはできませんが、次のことが正しいと思います。

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()

于 2008-08-19T10:52:49.310 に答える
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));
于 2008-08-20T14:34:20.080 に答える