我遇到了一个相当烦人的问题,使用crc16散列来管理我的一些信息。
在我的应用程序中,我将一些信息传递到一个url参数(一个巨大的编码上下文)中。这个上下文允许用户恢复他们以前的搜索在这种情况下,我对一些元素进行了哈希处理,以确保不会占用太多字符。
似乎有些元素返回相同的散列(crc16算法)。
我将has转换成一个字符串:crc.to string(“X4”);
例如,两个不同的元素给了我:5A8E。
我试图使用crc32,但如果我这样做,旧的上下文将不会被识别。
你知道我怎样才能找到解决办法吗?谢谢
最佳答案
即使crc16是一个理想的散列函数(事实并非如此),它只有16位,Birthday Paradox意味着在一组只有2^8=256个项的数据中,散列冲突的可能性大约为50%。你几乎肯定需要更多的信息。
你不能让旧的散列工作,让他们区别现有的碰撞——这是矛盾的。但是,您可以实现一个新的、更好的散列方案,在url参数中添加一个标志来指示您正在使用这个新方案,确保您的所有页面只生成这些新样式的url,以及“祖父式”旧样式的url(这将继续产生与以前相同的冲突)。我建议给用户一个大的,明亮的信息来更新他们的书签,并自动重定向页面,每当你得到一个旧风格的网址。