无需排序的哈希 UUID
Hash UUIDs without requiring ordering
我有两个 UUID。我想完美地散列它们以产生一个唯一的值,但有一个约束 f(m,n) 和 f(n,m) 必须生成相同的散列。
- UUID 是 128 位值
- 哈希函数应该没有冲突 - 所有可能的输入配对都必须生成唯一的哈希值
- f(m,n) 和 f(n,m) 必须生成相同的散列 - 也就是说,排序不是重要
- 我在 Go 中工作,所以结果值必须适合 256 位 int
- 哈希不需要是可逆的
有人可以帮忙吗?
首先将它们与较小的连接起来。
以 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 位输出宽度,您也很难找到保证没有冲突的东西。
我有两个 UUID。我想完美地散列它们以产生一个唯一的值,但有一个约束 f(m,n) 和 f(n,m) 必须生成相同的散列。
- UUID 是 128 位值
- 哈希函数应该没有冲突 - 所有可能的输入配对都必须生成唯一的哈希值
- f(m,n) 和 f(n,m) 必须生成相同的散列 - 也就是说,排序不是重要
- 我在 Go 中工作,所以结果值必须适合 256 位 int
- 哈希不需要是可逆的
有人可以帮忙吗?
首先将它们与较小的连接起来。
以 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 位输出宽度,您也很难找到保证没有冲突的东西。