php 字符 hash_PHP如何把字符串hash成10进制数字

博客内容探讨了MD5散列的计算问题,指出Sunyanzi算法存在的错误,特别是在base_convert函数中低位丢失的问题。作者通过使用bc数学扩展来避免位运算拼接法的局限,将MD5字符串转换为10进制并进行加权计算,但发现计算结果与预期不符。代码示例展示了如何通过bcmath函数进行计算,并且验证了在32位和64位系统上的兼容性,尽管计算效率较低。作者寻求更优的解决方案。
摘要由CSDN通过智能技术生成

我刚刚正在想这个问题就是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的这样移位但是数据会溢出要反复拼接字符串我搞不定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值