Hash 在映射键值对时,哈希如何防止冲突?

Hash 在映射键值对时,哈希如何防止冲突?,hash,mapping,Hash,Mapping,如果散列的目的是防止键值对(map)上的冲突,那么散列如何实现这一点呢?如果你给一个散列算法取名为“Jon Smith”,它不是每次都会给你相同的结果吗?因此,在不散列字符串的情况下使用“John Smith”有什么区别,比如,如果我们有两个不同的John Smith,它们的值不同,我们如何知道为什么我们应该选择一个,因为链锁基本上就是把所有的John Smith放在一个桶里,两个john Smith可能返回不同的值,我们需要知道它是哪一个 我试过在谷歌上搜索,但找不到好的答案,我真的很想得到一

如果散列的目的是防止键值对(map)上的冲突,那么散列如何实现这一点呢?如果你给一个散列算法取名为“Jon Smith”,它不是每次都会给你相同的结果吗?因此,在不散列字符串的情况下使用“John Smith”有什么区别,比如,如果我们有两个不同的John Smith,它们的值不同,我们如何知道为什么我们应该选择一个,因为链锁基本上就是把所有的John Smith放在一个桶里,两个john Smith可能返回不同的值,我们需要知道它是哪一个

我试过在谷歌上搜索,但找不到好的答案,我真的很想得到一些解释


提前谢谢

我想你理解错误的想法。通常,每次使用哈希函数时,它都应该返回相同的值,换句话说,它应该是确定性的

哈希还有其他好处:

  • 它可以用来计算对象的索引,然后可以在哈希集或哈希映射中使用。散列映射计算该键的散列,然后将与该键关联的值存储在数组中散列的位置
  • 如果一个大对象集合包含重复项,则可以更容易地对其进行比较
  • 您可以存储密码的哈希值,而不是密码本身。当用户想要登录时,检查它是否生成与您最初存储的哈希值相同的哈希值

如果两个不同的输入映射到相同的哈希值,则会发生冲突。换句话说,哈希函数不是。理想情况下,没有比其他哈希值更频繁地生成哈希值,这意味着生成的值是均匀分布的。

冲突并不意味着每次都得到不同的哈希值,而是两个不同的输入产生相同的输出。您也不会使用散列作为标识符,而是作为签名或隐藏密码的一种方式,以便在事后验证密码。我编辑了我的问题,以更好地说明我的意思。不,您不会对密钥-值对进行散列,您只会对密钥进行散列。如果您有一个带有两个值(2或5)的“键”(如“John Smith”),那么它就不再是一对一映射了。您可以使用完整元组作为散列的键,因此(John Smith,2)与(John Smith,5)不同,但这是不同的散列和不同的数据结构(如列表或一组对)。通常,散列是一个实现细节。是的,但这正是问题所在。如果每次散列一个键时它都返回相同的值,比如说你用值5(键值对)散列一个键字符串“john smith”,另一个用值2散列另一个john smith,那么john smith返回相同的散列,但当你试图用散列查找它们时,你永远不知道该选择哪一个,因为有两个,它们有不同的值。所以您要存储这对(“john smith”,5)和这对(“john smith”,2)?在这种情况下,您可以将其存储为一组对。然后您必须散列这两个值对,这将导致不同的输出,因为2和5是不同的@MorinatorNo,例如,在散列映射中,每个键只分配1个值,而不是像2和5那样的倍数。地图不是你要找的东西。您需要的可能是HashSet,其中PersonNumberPair有两个字段,其中包含要配对的信息。因此,您不能在哈希映射中添加值为x的John Smith和值为y的John Smith?再说一遍,散列的意义是什么?