2012-12-14 20 views
0

为什么hmac值不同? $ a等于$ b。我不确定是什么样的错误导致这一点,或者如果我的逻辑是正确的。 Hmac_hash应该将任何输入转换为字符串为字节或十六进制,并做它的工作,告诉我,如果我错了。为什么hash_hmac为这两个大数制作不同的哈希值?

下面的示例代码。

谢谢。

<?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 

回答

2

当你比较$a$b,里面$b字符串转换为整数。由于该值大于PHP可以用整数表示的值,因此它会默默转换为float。 $a是一个浮动。花车是平等的,这就是比较成功的原因。

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

如果你想比较失败,使其与hash_hmac之间的行为是一致的,你要投$a成字符串第一或将要使用===避免转换数据类型。

+0

完美解释,谢谢 –

相关问题