Tag: 散列

具有32位整数低冲突率的快速string散列algorithm

我有很多不相关的命名的事情,我想快速search。 一个“Aardvark”在任何地方都是一个“土豚”,所以对这个string进行散列和重新使用这个整数对于加快比较速度是很有效的。 整套名称是未知的(随着时间而改变)。 什么是快速string哈希algorithm,将生成小(32或16)位值,并具有低冲突率? 我想看看特定于C / C ++的优化实现。

为什么XOR是哈希合并的默认方式?

假设你有两个哈希H(A)和H(B) ,你想合并它们。 我已经读过,将两个哈希合并的一个好方法就是将它们XOR ,例如XOR( H(A), H(B) ) 。 我已经find了最好的解释,在这里简要地谈谈这些散列函数的指导方针 : 对两个数字进行大致随机分布的结果,导致另一个数字仍然具有大致随机分布*,但现在取决于这两个值。 … *在两个数字的每一位进行组合,如果两个位相等,则输出0,否则为1.换句话说,在50%的组合中,将输出1。 所以如果两个input比特各自有0或1的几率,那么输出比特也是如此。 你能解释为什么XOR应该成为哈希函数(而不是OR或AND等)的默认操作的直觉和/或math吗?

boost :: hash_combine中的幻数

boost::hash_combine模板函数引用一个散列(称为seed )和一个对象v 。 根据文档 ,它结合了seed和v的散列 seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 我可以看到这是确定性的。 我明白为什么使用XOR。 我敢打赌,除了有助于将相似的值映射到很远的地方之外,所以探测哈希表不会中断,但是有人能解释一下这个魔术常量是什么吗?

在客户端是否值得哈希密码?

当我想放置一个login系统时,我总是比较给定密码的MD5和它在服务器端用户表中的值。 然而,我的一个朋友告诉我,一个“清晰”的密码可以被networking软件嗅探到。 所以我的问题是:散列在客户端的密码是一个好主意? 它比在服务器端散列它好吗?