如何避免crc16冲突?

How to avoid crc16 collisions?

我遇到了一个非常烦人的问题,使用 crc16 哈希来管理我的一些信息。

在我的应用程序中,我将一些信息传递给一个 url 参数,这是一个巨大的编码上下文。该上下文允许用户恢复他们的旧搜索。在这种情况下,我对一些元素进行了哈希处理,以确保它不会占用太多字符。

似乎有些元素 return 相同的散列(crc16 算法)。

我将 has 转换为字符串:crc.ToString("X4"); 例如,两个不同的元素给我:5A8E.

我尝试使用 crc32,但如果我这样做,将无法识别旧上下文。

你知道我如何找到解决方案吗?非常感谢

即使 CRC16 是一个理想的散列函数(它不是),只有 16 位,Birthday Paradox 也意味着在只有 2^8 的集合中有大约 50% 的机会发生散列冲突= 256 项。您几乎肯定需要更多位。

您不能让旧的哈希继续工作并且让它们区分现有的冲突——这是矛盾的。但是你可以实现一个新的、更好的哈希方案,在 URL 参数中添加一个标志来表明你正在使用这个新方案,确保你所有的页面只生成这些新样式 URL s,和 "grandfather in" 旧式 URLs(它将继续产生与以前相同的冲突)。我建议给用户一个大的、明亮的信息来更新他们的书签,并在你得到旧样式时自动重定向页面 URL。

解释一下我想到并正在实施的另一个解决方案。

我只是为我的元素准备了一个 crc32 和一个 crc16 散列。我将 32 用于我现在构建的新网址,但使用 crc16 哈希作为旧网址的后备。

因此,当我尝试比较散列时,我从新散列开始,如果我找不到任何元素,我会转到回退并将其与 crc16 散列进行比较。

这让我可以得到任何情况。