哈希码,为什么字符串和数字键对内存地址不好

Hash code, why is string and numeric key not good for memory address

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

这是有道理的,但后来他补充说 "except for numeric and string keys – Why?"

我认为原因是因为那时我们不能再应用哈希函数,但根据他的说法,事实并非如此。

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

他说是因为字符串是数组,数值也可以是数组。并且应用哈希函数只会将该字符的一部分分配给 'bucket array'.

问题是我们的讲师不是做讲义的人(他用的是前一位讲师去年的讲义)而且我认为他今天说的不对,请有人赐教?

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

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

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