如何找到一个简单哈希算法的碰撞
how do i find collision for a simple hash algorithm
我有以下哈希算法:
unsigned long specialNum=0x4E67C6A7;
unsigned int ch;
char inputVal[]=" AAPB2GXG";
for(int i=0;i<strlen(inputVal);i++)
{
ch=inputVal[i];
ch=ch+(specialNum*32);
ch=ch+(specialNum/4);
specialNum=bitXor(specialNum,ch);
}
unsigned int outputVal=specialNum;
bitXor只是进行Xor操作:
int bitXor(int a,int b)
{
return (a & ~b) | (~a & b);
}
现在我想找到一个算法,可以在outputVal给定时生成"inputVal"。(生成的inputVal不一定与原始的inputVal相同。这就是为什么我想找到碰撞)。这意味着我需要找到一种算法,该算法生成的解决方案,当输入上述算法时,结果与指定的"outputVal"相同。生成的解的长度小于等于32
方法一:暴力破解。这没什么大不了的,因为你的"specialNum"总是在int的范围内,所以在平均尝试几十亿个输入值之后,你会找到正确的一个。几秒钟就能搞定。
方法二:蛮力,但聪明。
考虑处理最后一个ch之前的specialNum值。首先计算(specialNum * 32) + (specialNum/4) + ch. Since -128 <= ch <128或0 <= ch <根据char的签名,您知道结果的最高23位,与ch无关。使用specialNum对ch进行xor后,您还知道最高23位(如果ch是有符号的,最高23位有两种可能的值)。您检查这23位是否与所需的输出匹配,如果不匹配,则一次性排除所有256个ch值。所以暴力破解方法平均在1600万步之后就结束了。>
现在考虑处理最后两个ch之前的specialNum值。同样,您可以在不检查最后两个字符的情况下确定结果的最高14位(如果ch有四个备选符号)。如果最高的14位不匹配,就结束了。
方法3:这就是你要做的。依次考虑长度为0、1、2等的所有字符串(然而,你的算法很可能会更快地找到一个解决方案)。在处理完字符串s后计算specialNum。按照您的算法,并允许char被签名,在处理了另外两个字符后,找到specialNum的最高14位可能具有的最多4个不同的值。如果其中任何一个匹配所需的输出,那么在处理下一个字符的256个可能值后检查specialNum的值,并在检查另一个字符后找到specialNum的最高23位可能具有的最多2个不同的值。如果其中一个匹配所需输出的最高23位,则检查处理了256个可能的下一个字符中的每个字符后的specialNum将是什么并查找匹配。
这应该在一毫秒以下工作。如果char是unsigned,它会更快。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 标准库容器最简单、性能差的哈希类是什么?
- 简单的 C++11 哈希函数无法编译
- 简单的密码哈希程序 c++
- 在C++中返回简单哈希码的函数
- 在简单的哈希表中解决内存泄漏和语法问题
- C++中的简单哈希方法
- 为什么我在为矢量实现这个简单的哈希时出现错误<int>?
- **在这个简单的哈希实现中做了什么?
- 使用boost库的简单哈希表
- 如何找到一个简单哈希算法的碰撞