2014-02-21 32 views
0

我想找到如何處理與HashTable碰撞檢測。哈希表碰撞檢測解決方案

我的散列算法不好,導致許多碰撞,我在一個更好的算法工作:HashKey = (Mid(HashKey, 1, 3) * Mid(HashKey, 1, 3) Mod 11)

我救了我的結構Stock

<Serializable()> 
Public Structure Stock 
    'Create a structure for the hash table stock file 
    <VBFixedString(10)> Public Barcode As String 
    <VBFixedString(20)> Public Category As String 
    <VBFixedString(20)> Public Title As String 
    <VBFixedString(20)> Public Description As String 
    <VBFixedString(4)> Public Quantity As Integer 
    <VBFixedString(8)> Public RRP As Double 
    <VBFixedString(8)> Public Cost As Double 
End Structure 

我目前用的手段檢測碰撞:

If HashTable(HashKey) = "" Then 
... 
SaveStock 
End If 

這是一種可靠的檢查方式嗎?如果檢測到碰撞,我如何解決VB.net。我是否必須實現自己的鏈表或者Hashtable類型是否具有處理它的屬性?

+0

您應該使用泛型集合,而不是HashTable。 – SLaks

+0

HashTable&Dictionary使用唯一鍵。代碼尖叫'使用類'的 – SLaks

+0

。我敢打賭,如果你添加了一個產品代碼(也許是一個BarCode版本),那麼它可以作爲一個Dictionary鍵 – Plutonix

回答

1

不要混淆密鑰和散列碼!密鑰必須是唯一的,並標識一個對象。散列碼是在使用散列表時從密鑰計算出來的。 HashTable通過調用密鑰的GetHashCode方法來完成此操作。

HashTable允許您通過密鑰存儲和查找對象。因此你必須使用一個已知的值作爲鍵。例如條形碼應該是唯一的。

Dim stockTable As HashTable = New HashTable() 
stockTable.Add(stock.Barcode, stock) 

如果與給定鍵的項目中沒有找到Item屬性返回Nothing。不要定義Stock作爲結構將其定義爲類。

Dim stock As Stock = DirectCast(stockTable(someBarCode), Stock) 
If stock Is Nothing Then 
    ' No item found with this key 
Else 
    ' Success! 
End If 
+0

謝謝!我將如何設置哈希碼,以及我在哪裏使用'GetHashCode'? –

+0

每個類和結構都從'object'繼承'GetHashCode',並且可以自由地覆蓋它。像'string','int'等所有標準系統類型都會覆蓋它並提供一個合適的實現。如果你實現你自己的類型,你也可以這樣做。但你不需要在任何地方打電話。 'HashTable'在鍵值內部調用它。您所要做的就是提供一個關鍵值,如條形碼,產品編號或庫存編號等。 –

0

HashTable和Dictionary均爲您處理散列衝突。您將獲得查找性能降級,但只要密鑰是唯一的(即使密鑰的散列不是),則不需要執行任何操作。容器將爲您處理存儲。

如果出於性能方面的原因,您仍希望減少散列衝突;在最壞的情況下(所有的密鑰散列相同),那麼它將成爲查找每個關鍵字的線性搜索。

+0

語法是什麼?程序在搜索時如何知道唯一鍵? @ChrisTavares –

+0

只要做'hashTable(key)= value'。其他一切都會自動處理。當然,您需要根據您的數據來確定關鍵是什麼。 –