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