【问题标题】:Why is hash_hmac making different hashes for these two large numbers?为什么 hash_hmac 为这两个大数做不同的哈希?
【发布时间】:2012-12-14 19:08:04
【问题描述】:

为什么 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

【问题讨论】:

    标签: php type-conversion gmp hmac


    【解决方案1】:

    当你比较$a$b时,$b里面的字符串被转换成一个整数。因为该值大于 PHP 可以表示为整数的值,所以它被默默地转换为浮点数。 $a 是一个浮点数。浮点数相等,这就是比较成功的原因。

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 2011-03-05
      • 2010-11-01
      • 2020-05-30
      • 2020-05-17
      • 2015-04-29
      • 2016-07-27
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多