首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果散列是唯一的,但哈希%大小在哈希表中是相同的,则会发生什么?

如果散列是唯一的,但哈希%大小在哈希表中是相同的,则会发生什么?
EN

Stack Overflow用户
提问于 2017-09-14 03:16:13
回答 1查看 85关注 0票数 1

最近我正在学习哈希表,并且理解的基础是

  1. 创建一个数组,例如 hashtable ht[4];
  2. 散列密钥 int hash = hash_key(key);
  3. 得到索引 int index = hash % 4
  4. 设置为hashtable ht[index] = insert_or_update(value)

我知道存在哈希冲突问题,如果key1key2有相同的哈希,它们会进入相同的ht[index],所以separate chaining可以解决这个问题。

具有相同哈希的密钥转到相同的桶中,这些密钥将存储在链接列表中。

我的问题是,如果散列是不同的,但是模数是相同的,会发生什么?

例如,

代码语言:javascript
运行
复制
hash(key1): 3
hash(key2): 7
hash(key3): 11
hash(key4): 15

所以索引是3,这些具有不同哈希和不同键的键会转到同一个桶中。

我搜索谷歌的一些哈希表实现,似乎他们不处理这种情况。我是不是想得太多了?有什么不对劲吗?

例如,这些实现:

https://gist.github.com/tonious/1377667#file-hash-c-L139

156

redis:https://github.com/antirez/redis/blob/unstable/src/dict.c#L488

nginx:hash.c#L34

他们只是比较一下键是否相等

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-14 03:44:03

如果两个对象的键散列到同一个桶,那么是否因为它们具有相同的散列,或者因为它们有不同的散列,但它们都将(通过模块)映射到同一个桶,这并不重要。正如您注意到的,由于这两种情况中的任何一种情况而发生的冲突通常通过将两个对象放置在特定于桶的列表中来处理。

当我们在哈希表中寻找一个对象时,我们正在寻找一个共享相同密钥的对象。散列/模操作只是用来告诉我们应该在哪个桶中查看对象是否存在。一旦找到了正确的桶,我们仍然需要直接比较找到的任何对象(即特定于桶的列表中的对象)的键,以确保找到了匹配的对象。

因此,两个具有不同哈希但映射到同一个桶的对象的情况工作的原因是相同的,两个具有相同哈希的对象可以工作:我们只使用桶查找候选匹配,并依靠键本身来确定真正的匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46209949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档