我刚刚正在想这个问题就是MD5的随机性。于是就要对其计算。看到这篇文章我就用其中算法做计算,发现散列特性丢失,最后证明是Sunyanzi的算法存在错误base_convert函数仍然存在错误,导致低位丢失,由于位运算拼接法适用的计算机的位数不同,所以我用的是bc数学拓展法。实现方法是把MD5的字符串分割后转10进制后用数学函数加权。具体代码如下
$z = md5('something');
$a=substr($z,-8);//末8位 共34位
$b=substr($z,-16,-8);//末16至末8位
$c=substr($z,-24,-16);//末24至末16位
$d=substr($z,0,-24);//高8位
echo $a."
";
echo $b."
";
echo $c."
";
echo $d."
";
echo $z."
";
$e=hexdec($a);
$f=hexdec($b);
$g=hexdec($c);
$h=hexdec($d);
echo $e."
";
echo $f."
";
echo $g."
";
echo $h."
";
$i = $e;
$j = bcmul($f,4294967296);
$k = bcmul(bcmul($g,4294967296),4294967296);
$l = bcmul(bcmul(bcmul($h,4294967296),4294967296),4294967296);
$x = bcadd(bcadd(bcadd($i,$j),$k),$l);
echo $i."
";
echo $j."
";
echo $k."
";
echo $l."
";
echo $x."
";
$y=bcadd(bcadd(bcadd(hexdec(substr($z,-8)),bcmul(hexdec(substr($z,-16,-8)),4294967296)),bcmul(bcmul(hexdec(substr($z,-24,-16)),4294967296),4294967296)),bcmul(bcmul(bcmul(hexdec(substr($z,0,-24)),4294967296),4294967296),4294967296));
echo $y."
";
?>
其中 z是输入的字符串,x的求解是计算方法具体实现。$y是我综合的一行语句调用的方法
最终算出的结果与一楼的结果不符。我算的是89699910832403514716458983386625829727并非6062结尾 实际使用就用两行行了
$z = md5('something');
$y=bcadd(bcadd(bcadd(hexdec(substr($z,-8)),bcmul(hexdec(substr($z,-16,-8)),4294967296)),bcmul(bcmul(hexdec(substr($z,-24,-16)),4294967296),4294967296)),bcmul(bcmul(bcmul(hexdec(substr($z,0,-24)),4294967296),4294967296),4294967296));
echo $y;
经检测在32位机和64位机均可使用 但是函数消耗较大,如有更好的方案请讲 之前想过 $a<<32的这样移位但是数据会溢出要反复拼接字符串我搞不定。