最近我学哈希表,并理解的基础,是如果散列值是唯一的,但哈希表中的散列%大小相同,会发生什么情况?
创建一个数组,例如
hashtable ht[4];
哈希关键
int hash = hash_key(key);
获得索引
int index = hash % 4
设置为hashtable中
ht[index] = insert_or_update(value)
而且我知道有散列冲突问题,如果key1
和key2
具有相同的哈希,他们去同ht[index]
,所以separate chaining
能解决这个问题。
键采用相同的哈希去同一个桶中,这些密钥将被存储在一个链表。
我的问题是,如果散列不同,会发生什么,但模数是相同的?
例如,
hash(key1): 3
hash(key2): 7
hash(key3): 11
hash(key4): 15
所以指数是3,这些键具有不同的散列和不同的密钥转到同一个桶
我搜索谷歌一些哈希表的实现,似乎他们不处理这种情况。我是否推翻了?哪里不对了?
例如,这些实现:
https://gist.github.com/tonious/1377667#file-hash-c-L139
的Redis: https://github.com/antirez/redis/blob/unstable/src/dict.c#L488
nginx的: https://github.com/nginx/nginx/blob/master/src/core/ngx_hash.c#L34
他们只是比较,如果键等于
模数决定了桶的大小,而且大部分时间散列都是不同的。在任何情况下,映射到同一个存储桶的两个条目都是冲突。 –
OT提示:通过在'hash%4'中使用素数而不是4进行修改会使索引更好,从而减少碰撞可能性。 – chux