【问题标题】:Unique hash function without any collisions独特的哈希函数,没有任何冲突
【发布时间】:2016-10-26 04:07:01
【问题描述】:

所以我得到了一个格式为 XYYYYZ 的键,其中 X 是来自 'A'-'Z' 的字符,YYYY 是从 0 到 9999 的 int,Z 是来自 'A'-' 的字符C'。我想创建一个没有任何冲突的唯一哈希函数。

有人告诉我最小的桌子尺寸是 780,000,但我不知道是怎么做的。

我能想到的是 X-'A' 得到一个从 0 到 26 的数字,然后乘以 100,000,然后将 YYYY 乘以 10,然后加上 (Z - 'A')

所以 Z1025A 为 2,610,250,L4444C 为 1,144,443

并且可能的组合是 2699993 和 / 2,700,000 的使用率约为 29%。

但是有没有其他方法可以减小表格的大小?

【问题讨论】:

    标签: c hash hashtable


    【解决方案1】:

    只是做

    ((Z - 'A') * 26 + (X - 'A')) * 10000 + YYYY
    

    【讨论】:

    • 谢谢!太多了,这让我很困扰。
    【解决方案2】:

    这种格式的键的最小哈希表大小是 780000,因为有 26 种方法可以选择第一个字符,有 10 种方法可以选择接下来的四个字符,还有 3 种方法可以选择最后一个字符。也就是说,有 26 * 10 * 10 * 10 * 10 * 3 = 780000 个可能的键。要查找哈希函数,请将哈希键视为计数器。像这样重新排列元素:

    ZXYYYYY

    从所有元素从零开始,每个“Y”元素在达到 9 后翻转。“X”在达到 25 后翻转,“Z”在达到 2 后翻转。所以,我们可以为四个“Y”元素:

    y4 y3 y2 y1 --> y1 + (y2 * 10) + (y3 * 100) + (y4 * 1000)

    这部分键只是一个以 10 为底的计数器。剩下的一对元素形成一个以 26 为基数的计数器,您可以通过将 0 到 25 的数字分配给第一个值 ('X') 来为这对分配一个数字,将 0 到 25 的数字乘以 26 到第二个,并添加结果:

    z x --> x + (z * 26)

    对于y4 y3 y2 y1,我们将得到一个从0到9999的值,对于z x,我们将得到一个从0到675的值。如果我们将此值乘以10000,我们可以将y4 y3 y2 y1得到的值相加获取密钥的唯一值。即四个低位从0到9的个数,0到90的十位,0到900的百位,0到9000的千位,而两个高位可以看作是从0到6750000以万计。这给出了一个可能的 6760000 个具有此哈希函数的唯一键。但是由于您的特定情况将“z”限制为三个字符,所以z x 只有 3 * 26 = 78 种可能性,因此可以使用此方法获得 780000 个唯一哈希,然后可以编写哈希函数:

    hval = y1 + (y2 * 10) + (y3 * 100) + (y4 * 1000) + (x + z * 26) * 10000

    其中 y1、y2、y3、y4、x 和 z 都表示整数值。或者,使用 C chars:

    int y1, y2, y3, y4;
    char x, z;
    long hval;
    
    hval = y1 + (y2 * 10) + (y3 * 100) + (y4 * 1000) + ((x - 'A') + (z - 'A') * 26) * 10000;
    

    我应该补充一点,以这种方式将拉丁字母转换为整数并不能保证按标准工作,但只要您有 ASCII 或 UTF-8 字符集,它就可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多