我有以下哈希算法:
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。由于-128现在在处理最后两个ch之前考虑specialNum值同样,您可以在不检查最后两个字符的情况下,确定结果中可能的最高14位(如果ch是用四个可选字符签名的)如果最高的14位不匹配,你就完了。
方法三:你就是这样做的。依次考虑长度为0、1、2等的所有字符串(但是,您的算法很可能会更快地找到解决方案)。在处理字符串s后计算specialnum。按照您的算法,并允许对char进行签名,找到specialnum的最高14位在处理另外两个字符后可能具有的最多4个不同值。如果其中任何一个匹配所需的输出,则在处理下一个字符的256个可能值中的每一个后检查specialnum的值,并在检查另一个字符后查找specialnum的最高23位可能具有的最多2个不同值。如果其中一个匹配所需输出的最高23位,那么在处理256个可能的下一个字符中的每一个之后,检查specialnum是什么,并寻找匹配。
这应该能在毫秒以下工作如果char是无符号的,则速度更快。