哈希表冲突检测到的解决方案

时间:2014-02-21 19:40:03

标签: vb.net linked-list hashtable collision-detection

我试图找到如何使用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类型是否具有处理它的属性?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

HashTable和Dictionary都会为您处理哈希冲突。您将获得查找性能降级,但只要密钥是唯一的(即使密钥的散列不是),您也不需要做任何事情。容器将为您处理存储。

如果出于性能原因,您仍然希望减少哈希冲突;在最坏的情况下(所有键都是相同的),然后它变成了对每个键进行线性搜索以进行查找。