【发布时间】:2015-12-31 00:02:47
【问题描述】:
我在库中已经有一个 64 位哈希函数(C 编码),但我只需要 48 位。我需要将 64 位哈希值缩减为 48 位值,但它必须以安全的方式进行,以尽量减少冲突。
散列函数是一个非常好的64位散列函数。它已经用 SMHasher(“DieHarder”哈希测试)进行了测试,证明比 Murmur2 更好。根据我的同事的说法,在 lib 中实现的 64 位散列算法是 xxHash,用 SMHasher 测试并获得了 10 的 Q.Score!想看的人可以在 github.com 上找到 xxHash 的源代码:github.com/Cyan4973/xxHash/releases/latest。
基本思想是让 64 位散列值中的所有位(或其中一部分)对生成的 48 位散列值产生影响。有没有办法做到这一点?
[后期编辑]:
所以我实现了自己的 48 位(准)-UUID 生成器。
请在此处查看完整的工作解决方案(包括源代码):https://stackoverflow.com/a/47895889/4731718。
【问题讨论】:
-
如果它真的是一个好 64位散列函数,那么它本质上是随机位,所以你可以随意抓取其中的48个。
-
有
2^6464 位哈希。您不能将它们放入2^4848 位散列中,至少有2^16堆积在同一个位置。 -
我认为您收到的回复没有帮助(和反对票),因为您不太清楚自己在寻找什么。 “'保留'所有 64 位的信息”意味着您希望能够撤消 64->48 转换,这意味着没有冲突。 “最小化碰撞”意味着您愿意接受一些碰撞(但不是很多)。您对 Lee Daniel Coker 的评论(不是答案)的支持意味着您对任何可以最大限度地减少冲突的解决方案感到满意,无论有多少冲突。这是三种不同的可能性。
-
他可能正在尝试构建自己的 UUID 版本 1 生成器的实现。这是我在计算机世界中所知道的 48 位哈希的唯一用途。 RFC 4122 确实允许将版本 1(或 2)UUID 中的 MAC 地址替换为随机的 48 位节点 ID,因为该节点没有 MAC 地址,或者因为不希望公开它。出于安全考虑,他可能不想透露他正在用哈希算法替换 UUID MAC 地址部分(48 位)。
-
@Teepeemm:因此,这个问题并不像看起来那么奇怪。全球许多程序员在尝试根据 RFC 4122 实现这个 UUID v1 48 位问题时都会遇到这个问题。我会投票赞成这个问题。
标签: c algorithm math hash uuid