散列UUID而无需订购

时间:2015-04-19 02:25:34

标签: hash uuid hashcode hash-function

我有两个UUID。我想完美地哈希它们以产生一个唯一值,但是有一个约束, f(m,n) f(n,m)必须生成相同的哈希值

  • UUID是128位值
  • 哈希函数应该没有冲突 - 所有可能的输入配对都必须生成唯一的哈希值
  • f(m,n) f(n,m)必须生成相同的哈希 - 即排序并不重要
  • 我在Go中工作,因此结果值必须符合256位int
  • 哈希不需要是可逆的

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

首先将它们与较小的一个连接起来。

答案 1 :(得分:0)

要建立在user2357112卓越解决方案的基础上,并将评论链简化,请让我们逐一考虑您的要求(并且不按顺序):

  • 没有碰撞

从技术上讲,这不是哈希函数。哈希函数是将异构的任意长度数据输入映射到固定宽度的同质输出。如果输入比输出长,那么实现这一目标的唯一方法是通过一些数据丢失。对于大多数应用程序,这是可以容忍的,因为散列函数仅用作快速查找键,并且代码回退到数据的较慢,完整的比较。这就是为什么许多指南和语言坚持if you implement one, you must implement the other

幸运的是,你说:

  • 两个UUID输入 m n
  • UUID各为128位
  • f(m,n)的输出必须为256位或更少

组合两个输入正好是256位,这意味着您不必丢失任何数据。如果您需要较小的输出,那么您将失去运气。实际上,您可以将两个数字连接在一起并生成完美,唯一的表示。

  • f(m,n) f(n,m)必须生成相同的哈希值

要完成此最终要求,请通过两个UUID的某些内在值来决定连接顺序。建议的小首先工作很棒。然而...

  • 哈希不需要是可逆的

如果您特别需要不可逆哈希,那完全是另一个问题。在使用加密哈希函数时,您仍然可以使用小于比较来确保顺序独立性,但是即使对于256位输出宽度的固定宽度输入,您也很难找到保证不会发生冲突的东西。