Data structures 哈希代码,为什么字符串和数字键不适合存储地址

Data structures 哈希代码,为什么字符串和数字键不适合存储地址,data-structures,hash,hashcode,Data Structures,Hash,Hashcode,在数据结构讲座(目前仍在进行)中,我们的讲师解释了散列码对于内存地址很有用 这是有道理的,但他接着补充道:“除了数字键和字符串键——为什么?” 我认为原因是因为那时我们不能再应用散列函数了,但据他说那不是真的 因为我们可以为字符串实现不同的哈希函数,也可以使用内存地址的整数表示 他声称原因是字符串是数组,数字也可以是数组类型。而应用散列函数只会将该字符的一部分分配给“bucket数组” 问题是我们的讲师不是做讲稿的人(他去年用的是上一位讲师的讲稿),我不认为他今天说的是对的,有人能告诉我这一点吗

在数据结构讲座(目前仍在进行)中,我们的讲师解释了散列码对于内存地址很有用

这是有道理的,但他接着补充道:“除了数字键和字符串键——为什么?”

我认为原因是因为那时我们不能再应用散列函数了,但据他说那不是真的

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

他声称原因是字符串是数组,数字也可以是数组类型。而应用散列函数只会将该字符的一部分分配给“bucket数组”


问题是我们的讲师不是做讲稿的人(他去年用的是上一位讲师的讲稿),我不认为他今天说的是对的,有人能告诉我这一点吗?

你提到的这些讲稿直接来自古德里奇和塔马西亚的书(包括算法设计讲稿和数据结构)。它讨论了各种散列码函数,例如使用对象的内存地址、使用整数转换、分量和或多项式累加。它指出,使用对象的内存地址“一般来说是好的,除了数字键和字符串键”

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


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

“哈希代码对内存地址有用”是什么意思?您好,他告诉我们哈希代码用于整数转换(适用于长度小于或等于整数类型位数的键)、内存地址和组件sumsWithout context,整个讨论令人费解。我们的课刚刚开始讨论哈希表,还没做什么。我们从散列函数和散列表的定义开始。然后讲稿说明了为什么散列码是有用的。它说“内存地址:我们将key对象的内存地址重新解释为一个整数(所有Java对象的默认哈希代码),除了数字键和字符串键——为什么?”因为数字和字符串通常是通过内容而不是身份进行比较的,当然这也适用于许多记录类型,请问您是如何找到这些内容的来源的?当你看到这个问题时,你是否碰巧读过那本书?这本书的出版商提供了教育家经常使用(经过一些修改)的课堂幻灯片。在阅读它们的过程中,我遇到了一个类似的问题,这就是为什么我会来到这里:)