0

その歴史は長いですが、問題は単純です。一致する値をキャッシュする必要がある 3 つの文字列があります。高速キャッシュを使用するには、次のコードを使用します。

public int keygen(string a, string b, string c)
    {
        var x = a + "@@" + b + "@@" + c;
        var hash = x.GetHashCode();
        return hash;
    }

a(文字列,bcはコードが含まれていないことに注意してください"@@") キャッシュ自体は単なるDictionary<int, object>

ハッシュキーが一意ではない可能性があるというリスクがあることは知っていますが、これを除いて:

int キーを作成するより速い方法を知っている人はいますか? (C# の場合) この操作には合計 CPU 時間の約 15% がかかり、これは長時間実行されるアプリです。

いくつかの実装を試しましたが、より高速なものを見つけることができませんでした。

4

5 に答える 5

4

を使用する必要がありますDictionary<Tuple<string,string,string>, object>。その場合、非一意性について心配する必要はありません。Dictionary が処理してくれるからです。

于 2013-10-08T14:29:27.620 に答える
3

文字列を連結する (新しい文字列を作成する) 代わりに、XORより簡単な数学 ( J.Skeet の功績)を使用できます。

public int keygen(string a, string b, string c)
{
    unchecked // Overflow is fine, just wrap
    {
        int hash = 17;
        hash = hash * 23 + a == null ? 0 : a.GetHashCode();
        hash = hash * 23 + b == null ? 0 : b.GetHashCode();
        hash = hash * 23 + c == null ? 0 : c.GetHashCode();
        return hash;
    }
}

一般に、一意のハッシュを生成する必要はありません。ただし、衝突は最小限に抑える必要があります。

もう1つの(効率的ではない)方法は、組み込みのサポートを持つ匿名型を使用することです GetHashCode

public int keygen(string a, string b, string c)
{
    return new { a, b, c }.GetHashCode();
}

匿名型のハッシュコードの計算には、名前、型、および順序が重要であることに注意してください。

于 2013-10-08T14:29:30.997 に答える