我知道原始的md5算法产生128位散列。
按照Mark Adler的评论here,我有兴趣获得一个好的64位哈希值。 有没有办法使用OpenSSL创建基于md5的64位哈希? (md5看起来足够满足我的需求)。 如果没有,是否在OpenSSL库中实现了另一种算法,可以以不低于md5的质量完成这项工作(当然长度除外)?
答案 0 :(得分:2)
我声称,'哈希质量'与哈希长度密切相关。 AFAIK,OpenSSL没有64位哈希算法,所以我的第一个想法很简单,很可能毫无价值:
halfMD5 = md5.hiQuadWord ^ md5.lowQuadWord
最后,我只是使用具有适当输出的算法,如crc64。
一些crc64来源验证:
<小时/> 的修改
乍一看,詹金斯看起来很完美,但是到目前为止,我正试图找到一个友好的c ++实现而没有运气。顺便说一句,我想知道,因为对于数据库的复制检查来说这是一个很好的哈希,为什么常见的开源库,比如OpenSSL,提供了它的API呢? - 地铁
这可能仅仅是因为OpenSSL首先是一个加密库,使用具有适当加密特性的大哈希值。
用于数据结构的哈希算法具有一些其他主要目标,例如哈希表的良好分布特征,其中小哈希值用作包含零个,一个或多个(冲突)元素的桶列表的索引。
重点是,是否,如何以及在何处处理碰撞。 在典型的DBMS中,列上的索引将自行处理它们。
相应的容器(地图或集合):
C ++:std::unordered_multimap
(32或64位)std::unordered_multiset
和std::unordered_map
在java中,可以使用列表作为存储区进行映射:std::size_t
唯一约束还会禁止插入相等的字段内容:
C ++:std::unordered_set
(32或64位)HashMap
和HashSet
Java HashMap<K,List<V>>
(32位){{3}}和{{3}}
例如,我们有一个包含文件内容的表(明文,非加密应用程序)以及用于映射或一致性检查的校验和或哈希值。我们想要插入一个新文件。为此,我们预先计算哈希值或校验和,并分别查询具有相等哈希值或校验和的现有文件。如果不存在,则不会发生碰撞,插入是安全的。如果存在一个或多个现有记录,则完全匹配的概率很高,“真实”碰撞的概率较低。
如果应省略冲突,可以向哈希列添加唯一约束,并重用现有记录,可能存在不匹配/冲突内容。在这里,你想要一个像'Jenkins'这样的数据库友好的哈希算法。
如果需要处理冲突,可以在明文列中添加唯一约束。像crc这样的数据库友好的校验和算法不会对记录之间的冲突产生影响,可以根据要检测的某些类型的损坏或其他要求进行选择。甚至可以使用开头提到的md5的XOR'ed四字。
其他一些想法:
简而言之,它在很大程度上取决于您希望使用64位哈希算法实现什么目标。