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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值