c++ OpenSSL:基于md5的64位哈希
C++ OpenSSL: md5-based 64-bits hash
我知道原来的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) forstd::unordered_multimap
和std::unordered_multiset
-
在java中,可以用列表作为bucket来创建映射:
HashMap<K,List<V>>
唯一约束将另外禁止插入相等的字段内容:
-
c++:
std::size_t
(32或64位)用于std::unordered_map
和std::unordered_set
-
Java:
int
(32位)forHashMap
andHashSet
例如,我们有一个包含文件内容(明文,非加密应用程序)的表和一个用于映射或一致性检查的校验和或哈希值。我们想要插入一个新文件。为此,我们分别预先计算哈希值或校验和,并查询具有相同哈希值或校验和的现有文件。如果不存在,则不会发生碰撞,插入将是安全的。如果存在一条或多条现有记录,则精确匹配的概率很高,而"真实"碰撞的概率较低。
-
如果应该省略冲突,可以向哈希列添加唯一约束,并重用可能存在不匹配/冲突内容的现有记录。在这里,你想要一个数据库友好的哈希算法,如'Jenkins'。
-
在需要处理冲突的情况下,可以向明文列添加唯一的约束。像crc这样对数据库不太友好的校验和算法不会对记录之间的冲突产生影响,并且可以根据要检测的某些损坏类型或其他需求进行选择。甚至可以像开头提到的那样使用md5的异或四字。
其他一些想法:
- 如果纯文本列上的索引/约束执行映射,则可以使用任何散列值进行合理的快速查找以找到潜在的匹配。
- 没有人会阻止你添加两者,映射友好的哈希和校验和。
- 唯一约束也将添加索引,这基本上就像上面提到的哈希表。
简而言之,这在很大程度上取决于你想用64位哈希算法实现什么。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 如何为位集找到/实现一个好的哈希函数
- 如何在 64 位平台上计算 32 位哈希C++?
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 如何将C++项目从 32 位迁移到 64 位以支持 MAC OS 10.14(莫哈韦)?
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 从 2 个 uint64 值中提取诡异哈希 128 位值
- 有效地将 16 位整数哈希为 256 位空间
- 大于 64 位的索引的哈希函数
- 将 32 位数字快速哈希到数组中
- 迁移一个哈希函数,其中包含从 C++/Qt 到 Java 的 32 位无符号整数
- c++中的64位哈希表
- 使用异或和位移位的字符串哈希算法
- MurmurHash3是否有可能产生一个64位哈希,上面32位都是0
- 如何访问数以百万计的位进行哈希
- c++ OpenSSL:基于md5的64位哈希
- 什么样的哈希函数能从字符串中得到32位的值