【问题标题】:Hash code, why is string and numeric key not good for memory address哈希码,为什么字符串和数字键不适合内存地址
【发布时间】:2017-08-05 04:49:10
【问题描述】:

在数据结构讲座(现在仍在进行)中,我们的讲师解释说哈希码对内存地址很有用。

这是有道理的,但后来他补充说“除了数字和字符串键 - 为什么?”

我认为原因是因为那时我们不能再应用哈希函数,但据他说这不是真的。

因为我们既可以为字符串实现不同的哈希函数,也可以使用内存地址的整数表示。

他声称原因是因为字符串是数组,而数字也可以是数组类型。并且应用哈希函数只会将该字符的一部分分配给“桶数组”。

问题是我们的讲师不是做课堂笔记的人(他使用的是去年的前任讲师的),我认为他今天所说的不正确,请问有人能告诉我吗?

【问题讨论】:

  • “哈希码对内存地址有用”是什么意思?
  • 你好,他告诉我们的是hash码用于整数转换(适用于长度小于或等于整数类型位数的key)、内存地址和组件求和
  • 没有上下文,整个讨论是不可理解的。
  • 我们的课程刚刚开始学习哈希表,还没有做太多事情。我们从散列函数和散列表的定义开始。然后讲义说明了为什么哈希码很有用。它说“内存地址:我们将键对象的内存地址重新解释为整数(所有 Java 对象的默认哈希码)一般来说很好,除了数字和字符串键 - 为什么?”
  • 因为数字和字符串通常按内容而不是身份进行比较,当然这也适用于许多记录类型。

标签: data-structures hash hashcode


【解决方案1】:

您参考的这些讲义直接来自 Goodrich 和 Tamassia 的书(算法设计一和数据结构)。它讨论了各种散列码函数——例如使用对象的内存地址、使用整数转换、分量求和或多项式累加。它指出,使用对象的内存地址“一般来说是好的,除了数字和字符串键”。

有时,根据内存地址将对象映射到整数的哈希码就足够了,即使该对象是字符串也是如此。但是,具有相等值的两个对象 (a='hello', b='hello') 使用此方法不会具有相同的哈希码,因为它们具有不同的内存地址。 这同样适用于其他对象,例如数字键(a=10,b=10 值相等,但内存地址不相等)。

考虑一个将用户密码存储为哈希码的简单系统。如果用户输入密码,他们输入的字符串将根据相同的哈希函数进行哈希处理,并与存储的字符串进行比较。这两个密码具有相同的值(用户第一次创建的密码和他们用于登录的密码),因此它们应该产生相同的哈希才能成功登录。因此,我们不希望使用内存地址来映射在这种情况下将字符串转换为整数。

【讨论】:

  • 哇哦,请问您是如何找到这些内容的来源的?当你看到这个问题时,你碰巧读过那本书吗?
  • 这本书的出版商提供了教育工作者经常使用的讲座幻灯片(经过一些修改)。在阅读它们时,我对将我带到这里的措辞有类似的问题:)
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2013-05-02
  • 2021-12-23
  • 1970-01-01
  • 2020-01-18
  • 2012-10-03
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多