【问题标题】:C++ OpenSSL: md5-based 64-bits hashC++ OpenSSL:基于 md5 的 64 位哈希
【发布时间】:2013-03-05 18:09:05
【问题描述】:

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

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

【问题讨论】:

  • 至少和 md5 一样多。
  • 我的意思是,您的哈希函数需要什么标准?速度?密码强度?整个散列空间的均匀分布?碰撞几率低?对单比特变化敏感吗?
  • 我希望冲突的可能性至少与 md5 提供的一样低。
  • 如果您只使用 64 位,而 MD5 使用 128 位,则无法使用。但看起来下面已经有一个可能适合您的答案。
  • 我明白这一点。但是由于我的数据库条目的数量并不多,我不需要这么长的哈希,正如 Adler 在我的帖子中提到的链接中指出的那样。所以,确实我不会想出像 md5 那样强的散列,因为它的长度很短,但我希望它在算法上与 md5 在冲突方面一样强。让我们这样说吧:我希望它能够防止小型数据库上的冲突,就像 md5 对 2^32 倍大的数据库所做的那样(如果你转到上述链接并搜索字符串“A good hash algorithm”,你会明白为什么我写的是 2^32 而不是 2^64)。

标签: c++ openssl md5


【解决方案1】:

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

halfMD5 = md5.hiQuadWord ^ md5.lowQuadWord

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

一些需要验证的 crc64 来源:


编辑

乍一看,Jenkins 看起来很完美,但是到目前为止,我正试图为它找到一个友好的 c++ 实现,但没有运气。顺便说一句,我想知道,既然这对于数据库的重复检查来说是一个很好的哈希,那么为什么非公共开源库(如 OpenSSL)提供了它的 API? – 地铁

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

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

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

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

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


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

  • 如果应该省略冲突,可以向哈希列添加唯一约束并重用现有记录,但可能会导致内容不匹配/冲突。在这里,您需要一个数据库友好的哈希算法,例如“Jenkins”。

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

其他一些想法:

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

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

【讨论】:

  • 感谢您的回复。你是绝对正确的,但我需要的是一种防止小型数据库发生冲突的算法,就像 md5 对 2^32 倍大的数据库所做的那样(如果你转到我在我的问题中提到的链接并搜索字符串“A good hash算法”你可能会明白我的意思)。
  • 我明白了。其中之一,例如那么詹金斯应该工作吗?:en.m.wikipedia.org/wiki/List_of_hash_functions#section_3
  • 乍一看,詹金斯看起来很完美,但是到目前为止,我正试图为它找到一个友好的 c++ 实现,但没有运气。顺便说一句,我想知道,既然这对于数据库的重复检查来说是一个很好的哈希值,那么为什么没有像 OpenSSL 这样的常见开源库提供了它的 API?
  • @Subway:见编辑。您能否添加一些有关您需要 64 位哈希的详细信息?。
  • 这阐明了这个主题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多