在数据结构讲座中(现在仍在发生),我们的讲师解释说,哈希码对内存地址非常有用。
这是有道理的,但后来他补充说“除了数字和字符串键 - 为什么?”
我认为原因是因为我们不能再应用哈希函数了,但根据他的说法,这不是真的。
因为我们可以为字符串实现不同的散列函数或使用内存地址的整数表示。
他声称原因是由于字符串是数组而数字也可以是数组类型。并且应用哈希函数只会将该字符的一部分分配给'桶阵列'。
问题是我们的讲师不是那个做演讲笔记的人(他去年使用过前一位讲师),我不认为他今天所说的是正确的,有人可以开导我吗?< / p>
答案 0 :(得分:2)
您提到的这些讲义直接来自Goodrich&amp; Tamassia的书(算法设计一和数据结构)。它讨论了各种哈希代码函数 - 例如使用对象的内存地址,使用整数转换,组件总和或多项式累积。它指出,使用对象的内存地址“通常很好,除了数字和字符串键”。
有时,即使该对象是字符串,基于其内存地址将对象映射到整数的哈希码也足够了。但是,具有相同值的两个对象(a ='hello',b ='hello')将不会使用此方法具有相同的哈希码,因为它们具有不同的内存地址。这同样适用于其他对象,如数字键(a = 10,b = 10的值相等但不在内存地址中)。
考虑一个简单的系统,它将用户的密码存储为哈希码。如果用户输入密码,则根据相同的散列函数对输入的字符串进行散列,并与存储的字符串进行比较。这两个密码具有相同的值(用户首次创建的密码和用于登录的密码),因此它们应该生成相同的哈希值以成功登录。因此,我们不希望使用内存地址来映射字符串到此方案中的整数。