Hash 散列UUID而不需要排序

Hash 散列UUID而不需要排序,hash,uuid,hashcode,hash-function,Hash,Uuid,Hashcode,Hash Function,我有两个UUID。我想对它们进行完美的散列,以生成一个唯一的值,但有一个约束,即f(m,n)和f(n,m)必须生成相同的散列 UUID是128位的值 哈希函数应该没有冲突-所有可能的输入对都必须生成唯一的哈希值 f(m,n)和f(n,m)必须生成相同的散列-也就是说,排序并不重要 我在Go中工作,因此结果值必须适合256位整数 散列不需要是可逆的 有人能帮助吗? 首先用较小的一个连接起来。< /P> < P>在USER 3557 112的精彩解决方案上建立并注解评论链,让我们逐一考虑你的需求

我有两个UUID。我想对它们进行完美的散列,以生成一个唯一的值,但有一个约束,即f(m,n)和f(n,m)必须生成相同的散列

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

有人能帮助吗?

首先用较小的一个连接起来。< /P> < P>在USER 3557 112的精彩解决方案上建立并注解评论链,让我们逐一考虑你的需求(和无序):

  • 没有碰撞
从技术上讲,这不是散列函数。散列函数是关于将异构的、任意长度的数据输入映射到固定宽度的、同质的输出。如果输入比输出长,实现这一点的唯一方法是通过一些数据丢失。对于大多数应用程序来说,这是可以容忍的,因为哈希函数仅用作快速查找键,而代码会返回到较慢的、完整的数据比较中。这就是为什么许多指南和语言坚持这一点

幸运的是,你说:

  • 两个UUID输入m和n
  • uuid每个为128位
  • f(m,n)的输出必须为256位或更少
两个输入加起来正好是256位,这意味着您不必丢失任何数据。如果你需要一个较小的输出,那么你就不走运了。实际上,您可以将这两个数字连接在一起,并生成一个完美、唯一的表示形式

  • f(m,n)和f(n,m)必须生成相同的散列
为了完成这一最终需求,通过两个UUID的一些内在值来决定连接顺序。建议的较小的第一个效果非常好。然而

  • 散列不需要是可逆的

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

这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@MZaragoza:不,是的。这符合问题的所有要求。你能解释一下怎么做吗。多做一点clear@MZaragoza:不清楚OP在go中如何处理128位或256位数字,因此不清楚如何提供示例代码,但假设您想将2位十进制数对散列为单个4位十进制数。然后这个解决方案将
(05,22)
散列到
0522
(53,40)
散列到
4053
@cachvico:就是这样。那是你的杂烩。如果您需要从哈希表中提取问题中未列出的其他属性,如“avalanching”或“bucket resistance”,您可能需要在其上应用另一个函数,但在不知道您需要什么属性的情况下,我不能建议使用。考虑一下维基百科的情况。