如何编写哈希函数使这样的表达式成为真?

时间:2017-03-10 05:39:55

标签: algorithm hash

伪代码:

<击> // deprecated x!=y && hash(x) == hash(y) // how to make this true?

x!=y && hash(x) == hash(y) && (z!=x && z!=y) && (hash(x) != hash(z) && (hash(y) != hash(z)) // how to make this true?

x和y可以是任何可读值

无论语言是什么,伪代码只是帮助理解我的意思。 我只是想知道如何实现这样的哈希函数。

PS:对于数学,我是个白痴。我无法想象是否有算法可以做到这一点。

更新1: 伪代码有bug,所以我更新了代码(实际上还有bug,没关系,我会解释)。

我原来的要求是创建一个可以为不同参数返回相同值的哈希函数,并且参数值应该包含一些规则。这意味着,只有同一类别中的参数值才会获得相同的哈希码,而其他参数值则不会。

e.g。

以下表达式显然(您可以将'0'视为占位符):

hash("1.1") == hash("1.0") == hash("0.1")
hash("2.2") == hash("2.0") == hash("0.2") 

hash("2.2") != hash("2.1") != hash("1.2") 

我认为这个问题可以做这样的描述:

  1. 有两个或多个不同的值包含隐含的相同属性。
  2. 只有这些值在世界上具有相同的属性。
  3. 属性可以通过某种方式获得(可能是一个函数),hash()会在里面调用它。
  4. hash()其中一个值,您可以检索该属性,然后就可以获得唯一的hashCode。
  5. 它看起来像哈希冲突,但我们确切地知道它们是什么。也看起来像多对一模型。

    如何设计碰撞规则?值可以是任何字符或数字。以及如何实施设计?

    PPS:这是一个充满bug的问题,也许更新的部分也无法解释问题。或者这可能是一个错误的命题。我希望抽象我的问题作为一般模型,但它让我的思绪溢出。如有必要,我会发布我面临的实际问题。

2 个答案:

答案 0 :(得分:2)

任何常量哈希都可以满足您的条件:

hash(v) = 42

答案 1 :(得分:0)

与yuri kilocheck相比,一个不太常见的答案是使用mod运算符:

hash(v) = v % 10;

然后你会:

hash(1) = 1
hash(2) = 2
hash(3) = 3
...
hash(11) = 1
hash(12) = 2