我试图找到如何使用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 :(得分: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都会为您处理哈希冲突。您将获得查找性能降级,但只要密钥是唯一的(即使密钥的散列不是),您也不需要做任何事情。容器将为您处理存储。
如果出于性能原因,您仍然希望减少哈希冲突;在最坏的情况下(所有键都是相同的),然后它变成了对每个键进行线性搜索以进行查找。