我正在开发一个软件,需要使用预先计算的签名(4字节)检查重复的小文本(通常小于2 kb)。目前,我已经实现了CRC32(4byte)来实现这个目的,但我怀疑CRC32会产生很多重复值。我知道不可能让它真正独一无二,但至少我想尽量减少这种可能性。
- 更新1 -
注意:我无法增加哈希字节的大小。它花了我很多存储空间。我说的是大小超过1,000,000的条目。例如1,000,000 * 4字节= 4,000,000字节。我不能使用MD5,因为它需要16个字节!
- 更新2 - 我不想打开整个问题,但现在我必须这样做。
我的项目是一个字典引擎,可以搜索很多独立的数据库来查找用户的问句。必须立即准备所有结果(自动完成功能)。所有文本数据都已压缩,因此我无法解压缩它们以检查重复的结果。我必须在索引中存储压缩文本的哈希值。因此,散列字节增加索引大小,磁盘I / O 读取,解压缩和解码索引块(索引块也被压缩)。散列值通常是不可压缩的。该软件的设计迫使我压缩所有内容以满足用户的需求(在嵌入式系统中使用)。现在,我想使用哈希值从搜索结果中删除重复文本,以避免(未)压缩文本比较(由于磁盘I / O,这在我的情况下是不合理的。)
似乎我们可以设计符合条件的自定义校验和。例如,我将文本长度存储为2个字节并生成2个字节的校验和以检查重复的可能性?!
我提前感谢任何建议。
- 更新3 -
经过大量调查并使用答案提供的信息,感谢大家,我发现 CRC32 在我的情况下已经足够了。我在生成的CRC上运行了一些统计基准测试,在检查重复值后,结果令人满意。
谢谢你们所有人。我将对所有答案进行投票。
答案 0 :(得分:3)
如果没有进一步了解F2
,您可以期望的最好的是每个哈希值同样可能,并且大多数使用2 32个4字节值。即便如此,你很可能只与大约77000个文本发生冲突,更不用说一百万个了。除了一些例外(Adler32浮现在脑海中),众所周知的哈希函数在碰撞概率上差别很小。 (它们的难度不同,故意产生碰撞/给定值,以及计算/电路成本。)
→选择碰撞概率和存储要求之间的折衷方案
对于易于计算的校验和,请查看Fletcher's - Adler32非常相似,但短输入的碰撞概率增加。
答案 1 :(得分:1)
如果您遇到哈希冲突,您必须检查文本是否相等。最好的方法是计算碰撞发生了多少时间进行一些统计,如果它看起来很糟糕,那么优化它。我有这个想法,你可以构建2个不同的哈希值crc32和md5(或Luhn或任何你喜欢的),并且只有当两个哈希值具有相同的值时才检查相等性。
答案 2 :(得分:1)
我在其中一个项目中做了类似的事情。在我的项目中,我使用了一个名为 BLOOM FILTER ,watch的东西,关于这里的整个事情以及如何实现它,Bloom过滤器大大降低了 HASH COLLITIONS 的几率由于它使用了几种散列算法(但是它可以仅使用一个散列函数来模拟多个散列函数,但我们在这里是为了什么。)试试这个!它对我有用,也适用于你