我在使用.NET4中的短字符串進行哈希碰撞時遇到了問題。
編輯:我在使用內置的字符串散列函數。如何提高短字符串的散列以避免衝突?
我實施使用存儲轉換的方向是這樣
public class MyClass
{
private string _from;
private string _to;
// More code here....
public MyClass(string from, string to)
{
this._from = from;
this._to = to;
}
public override int GetHashCode()
{
return string.Concat(this._from, this._to).GetHashCode();
}
public bool Equals(MyClass other)
{
return this.To == other.To && this.From == other.From;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() != obj.GetType()) return false;
return Equals(obj as MyClass);
}
}
這是依賴於方向的和from
和to
對象的高速緩存是由短字符串,如「AAB」和「ABA表示」。
我得到這些小字符串的稀疏哈希碰撞,我嘗試了一些簡單的像添加鹽(沒有工作)。
問題是太多我喜歡「AABABA」小弦的碰撞與「ABAAAB」的反向其散列(請注意,這些都不是真實的例子,我不知道,如果AAB和ABA實際上導致衝突!)
和我已經重型像執行MD5(它的工作原理,但要慢得多)
我還實施了從喬恩斯基特這裏的建議:
Should I use a concatenation of my string fields as a hash code? 這工作,但我不知道知道它與我的各種3字符串是多麼可靠。
如何改善和穩定小字符串的散列而不增加太多像MD5的開銷?
編輯:爲迴應發佈的一些答案......緩存是使用從MyClass
鍵入的併發字典實現的,如上所述。如果我的代碼簡單的東西像@JonSkeet的代碼鏈接替換GetHashCode
上面我貼:
int hash = 17;
hash = hash * 23 + this._from.GetHashCode();
hash = hash * 23 + this._to.GetHashCode();
return hash;
一切功能正常。 值得注意的是,在這種特殊的使用情況下,緩存不在多線程環境中使用,所以沒有競爭條件。
編輯:我還應該指出,這種不正當行爲是平臺依賴。它在我完全更新的Win7x64機器上按預期工作,但在未更新的Win7x64機器上無法正常工作。我不知道什麼更新丟失的擴展,但我知道它沒有Win7 SP1 ...所以我會假設也可能有一個框架SP或更新它缺少以及。
編輯:由於抱怨,我的問題不是由哈希函數的問題引起的。我有一個難以捉摸的競爭條件,這就是爲什麼它在一些計算機上工作而不是其他人,以及爲什麼「較慢」的哈希方法使事情正常工作。我選擇的答案是最有用的理解爲什麼我的問題不是字典中的散列衝突。
你碰到3個字符的字符串?小心張貼其中的一些?我懷疑哈希函數以外的東西。 –
你能展示如何實現緩存嗎? – saus
在你已經顯示的代碼中,Equals並不是「公共虛擬BOOL Equals(object obj)」的重載......以及下面引用了哪些更新? – ttil