2017-07-08 49 views
0

假设我的散列表的桶数为100。我的散列码对于关键字A来说是500,对于关键字B是600。这两个对于hashCode % this.bucketCount来说分辨率为0,这是对不同散列码的冲突。为什么用%来计算hashCode索引转换?

我想知道为什么使用%来计算索引。有人可以解释这个数学吗?为什么该数学输出的索引是我应该插入节点的地方?

HashTable.prototype.hashFunction = function(key){ 
    var hash = 0; 
    for (var i=0;i< key.length; i++){ 
     console.log(key.charCodeAt(i)) 
     hash += key.charCodeAt(i) 
    } 
    return hash; 
}; 

HashTable.prototype.convertHashToIndex = function(hashCode) { 
    return hashCode % this.bucketCount; 
}; 

回答

3

因为有bucketCount桶,通过桶的数量分割的模量(或剩余部分)用于确保结果装配在可用的桶。如果你没有采取模数,你会得到的结果,而不能存储它们。

+1

Duh,有道理。然后,如果hashCodes获得相同的索引,我只需通过在该索引处散步返回的存储区(链接列表)并将节点附加到列表的末尾来处理此冲突 – Growler

+0

@Growler或者插入列表头部(或某处在列表中如果你喜欢)。但是,是的,这通常是如何处理冲突的。 –