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

C++ OpenSSL: md5-based 64-bits hash

本文关键字:64位 哈希 md5 基于 OpenSSL c++      更新时间:2023-10-16

我知道原来的md5算法产生一个128位的哈希值。

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

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

halfMD5 = md5.hiQuadWord ^ md5.lowQuadWord

最后,我将简单地使用具有适当输出的算法,如crc64。

一些需要验证的crc64源:

    http://www.backplane.com/matt/crc64.html
  • http://bioinfadmin.cs.ucl.ac.uk/downloads/crc64/
  • http://en.wikipedia.org/wiki/Computation_of_CRC
    • http://www.pathcom.com/~ vadco/crc.html


编辑

乍一看,jjenkins看起来很完美,但是我试图找到一个友好的c++实现,到目前为止还没有运气。顺便说一句,我想知道,既然这是一个很好的数据库重复检查哈希,为什么不是常见的开源库,如OpenSSL,提供它的API ?——地铁

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

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

所以关键是,是否,如何以及在哪里处理碰撞。在典型的DBMS中,列上的索引将自己处理它们。

对应的容器(映射或集合):

  • c++: std::size_t(32或64bit) for std::unordered_multimapstd::unordered_multiset

  • 在java中,可以用列表作为bucket来创建映射:HashMap<K,List<V>>

唯一约束将另外禁止插入相等的字段内容:

  • c++: std::size_t(32或64位)用于std::unordered_mapstd::unordered_set

  • Java: int(32位)for HashMap and HashSet


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

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

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

其他一些想法:

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

简而言之,这在很大程度上取决于你想用64位哈希算法实现什么。