为什么hash_hmac为这两个大数字做出不同的哈希?

时间:2012-12-14 19:08:04

标签: php type-conversion gmp hmac

为什么hmac值不同? $ a等于$ b。我不确定导致这种错误的错误是什么,或者我的逻辑是否正确。 Hmac_hash应该将任何输入转换为字符串转换为字节或十六进制并执行它的工作,告诉我我是否错了。

以下示例代码。

谢谢。

<?php

$a = 1234567890000*1234567890000;
$b = gmp_mul("1234567890000","1234567890000");
$b = gmp_strval($b);

echo $a."<br/>".$b."<br/>";

$c = 2525;

echo ($a==$b)."<br/>";

echo hash_hmac("SHA512",$a,$c);
echo "<br/>";
echo hash_hmac("SHA512",$b,$c);

?> 

结果

1.5241578750191E+24
1524157875019052100000000
1
973967436d3562150d60769b70a9010db21f89b114b9897430663dd195115b7893b9a6bd0e141cee301d23e2229afd6d39546630cd38f6fe7842073749f9ce3d
8bd1e7c837efaf8d51ed2d40354a020ee3c9663aa6bd4425c02b21ed02343185070216d37e54478ee78332af8e6fdecd51445fcee8cb04d4e51e4cc31283f9a9

1 个答案:

答案 0 :(得分:2)

比较$a$b时,$b内的字符串会转换为整数。因为该值大于PHP可以表示为整数的值,所以它会以静默方式转换为float。 $a是一个浮点数。浮点数相等,这就是比较成功的原因。

hash_hmac$a中的float转换为字符串,而不是将$b中的字符串转换为整数,然后溢出到float中。这就是哈希不同的原因。

如果您希望比较失败以使其与hash_hmac之间的行为保持一致,则您需要先将$a投射到字符串中,或​​者希望使用===避免转换数据类型。