有没有办法证明这个hascode算法的例子会给出唯一的值

时间:2014-08-12 22:12:31

标签: hashtable unique hashcode

我在看https://www.youtube.com/watch?v=UPo-M8bzRrc&index=21&list=PL4BBB74C7D2A1049C,(CS 61B第21讲:哈希表)和教授给出的例子是

你有两个字母的单词,每个字母都在a-z之间

public class Word{
      public static final int LETTERS = 26, WORDS = LETTERS * LETTERS;
      private String word;
      public int hashCode(){
            return LETTERS * (word.charAt(0)-'a') + word.charAt(1) - 'a';
      }
}

有没有办法证明(数学?)每个可能的单词将映射到0到675之间的不同值? 我已经证明范围在0到675之间(给#34; aa"" zz",但不确定如何证明唯一性。

1 个答案:

答案 0 :(得分:3)

获取哈希码的公式是:

hash = 26 * (A - 'a') + (B - 'a')
     = 26 * (A - 97)  + (B - 97)     // 'a' == 97 in ASCII
     = 26A + B - 27*97

所以我们需要证明的是26A + B对范围<97; 122>中的任何A和B都有不同的值(<'a'; 'z'>的十进制值)。我们忽略常数`27 * 97部分,因为它不会改变推理。

让我们看一下相反的陈述 - 当哈希码不明显时?如果A中的更改可以通过B的更改进行补偿,则不会有明显区别。所以以下内容必须如此:

26 * A1 + B1 = 26 * A2 + B2

我们假设A2 = A1 + 1

26 * A1 + B1 = 26 * (A1 + 1) + B2
             = 26 * A1 + B2 + 26

这意味着:

B1 = B2 + 26
B1 - B2 = 26

这是不可能的,因为B是范围内字母&lt;'a'的字符代码; “Z”取代。此范围(十进制ASCII值)为25(122-97)。对于每隔一个A1 - A2的差异,B所需的补偿会增加。

因此,通过证明相反的情况是不可能的,我们已经证明哈希码对于那些字符是唯一的。