【问题标题】:Hash function for specific set of Integers特定整数集的哈希函数
【发布时间】:2017-09-30 02:43:33
【问题描述】:

我有一组特定的整数,它们是:2、10、13、15、23、34、43、58、100、123、199、200 和 348。任务是创建一个 1 行哈希函数至少可以在索引 0 到 12 中映射 9 个值。

到目前为止,我制作的哈希函数是:

  1. hash = value%13
  2. hash = (value+array[indexOfValue])%13
  3. hash = array[indexOfValue]

数字 3 可能会让我受到责备,但我似乎可以接受,所以我不妨给出它作为答案。哦,我不应该使用任何冲突解决方法。

编辑:那么关于我应该制作什么散列函数有什么建议吗?

编辑:我找到了一个可以将所有值从 0 映射到 12 的函数,它是:((((x*7)+x)%7)+x)%13

【问题讨论】:

  • 你有什么问题?
  • @m_callens 抱歉,我已经编辑过了。
  • 投票结束,因为需要有自以为是的答案。
  • 有趣的单行散列函数要求消除了双散列选项。也许一个巧妙挑选的大素数可以用于散列?
  • @MichaelShopsin 这个数字不需要是素数,也不需要特别大,因为任何超过 348 的数字都会给你一个完美的哈希 ;-) ;-) ;-)

标签: java arrays hash


【解决方案1】:

我的(受过教育的)猜测是 XOR 将成为此处散列函数的良好基础。例如:

(value ^ c) % 13

通过在上述公式中尝试 [1, 200] 中 c 的所有值(蛮力)并计算为您的集合中的值生成了多少不同的哈希码,数字 72 出现了。例如

int[] values = new int[]{2, 10, 13, 15, 23, 34, 43, 58, 100, 123, 199, 200, 348};
for (int value : values) {
    System.out.print((value ^ 72) % 13);
}

将打印出来:

9 1 4 6 4 2 8 10 5 12 0 11 3

包括 [0, 12] 范围内的所有数字,除了 7 和 4 出现两次。

【讨论】:

  • 13 个可能的值有 13 个元素,因此重复并非不可避免。
  • 如果你仍然对映射所有值的函数感到好奇,我找到了一个:hash = ((((x*7)+x)%7)+x)%13跨度>
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2018-11-03
  • 2011-12-30
  • 2019-05-03
相关资源
最近更新 更多