C ++ OpenSSL:基于md5的64位哈希

时间:2013-03-17 09:36:36

标签: c++ openssl md5

我知道原始的md5算法产生128位散列。

按照Mark Adler的评论here,我有兴趣获得一个好的64位哈希值。 有没有办法使用OpenSSL创建基于md5的64位哈希? (md5看起来足够满足我的需求)。 如果没有,是否在OpenSSL库中实现了另一种算法,可以以不低于md5的质量完成这项工作(当然长度除外)?

1 个答案:

答案 0 :(得分:2)

我声称,'哈希质量'与哈希长度密切相关。 AFAIK,OpenSSL没有64位哈希算法,所以我的第一个想法很简单,很可能毫无价值:

halfMD5 = md5.hiQuadWord ^ md5.lowQuadWord

最后,我只是使用具有适当输出的算法,如crc64。

一些crc64来源验证:

<小时/> 的修改

  

乍一看,詹金斯看起来很完美,但是到目前为止,我正试图找到一个友好的c ++实现而没有运气。顺便说一句,我想知道,因为对于数据库的复制检查来说这是一个很好的哈希,为什么常见的开源库,比如OpenSSL,提供了它的API呢? - 地铁

这可能仅仅是因为OpenSSL首先是一个加密库,使用具有适当加密特性的大哈希值。

用于数据结构的哈希算法具有一些其他主要目标,例如哈希表的良好分布特征,其中小哈希值用作包含零个,一个或多个(冲突)元素的桶列表的索引。

重点是,是否,如何以及在何处处理碰撞。 在典型的DBMS中,列上的索引将自行处理它们。

相应的容器(地图或集合):

唯一约束还会禁止插入相等的字段内容:


例如,我们有一个包含文件内容的表(明文,非加密应用程序)以及用于映射或一致性检查的校验和或哈希值。我们想要插入一个新文件。为此,我们预先计算哈希值或校验和,并分别查询具有相等哈希值或校验和的现有文件。如果不存在,则不会发生碰撞,插入是安全的。如果存在一个或多个现有记录,则完全匹配的概率很高,“真实”碰撞的概率较低。

  • 如果应省略冲突,可以向哈希列添加唯一约束,并重用现有记录,可能存在不匹配/冲突内容。在这里,你想要一个像'Jenkins'这样的数据库友好的哈希算法。

  • 如果需要处理冲突,可以在明文列中添加唯一约束。像crc这样的数据库友好的校验和算法不会对记录之间的冲突产生影响,可以根据要检测的某些类型的损坏或其他要求进行选择。甚至可以使用开头提到的md5的XOR'ed四字。

其他一些想法:

  • 如果明文列上的索引/约束执行映射,则可以使用任何哈希值来进行合理快速的查找以查找潜在匹配。
  • 没有人会阻止你添加映射友好哈希和校验和。
  • 唯一约束也会添加一个索引,它基本上就像上面提到的哈希表一样。

简而言之,它在很大程度上取决于您希望使用64位哈希算法实现什么目标。