当我尝试使用php在哈希值中发现碰撞时,会出现问题。我可以成功找到第一个3字节的冲突。但是,当我尝试找到10字节的冲突时,array_search不起作用。它会向我返回一些非匹配值。谁能帮我?这是我的代码。
<?php
$array = array();
$do = true;
do {
$num1= rand(1,90000);
$num2= rand(1,90000);
$testcase2 = $num1."14040371D".$num2;
$testcase1 = (string)$testcase2;
$hashed = (string)substr(sha1($testcase1),0,10);
//echo($testcase1."\n");
$findornot = array_search($hashed,$array);
if($findornot !== false) {
$array[$testcase1] = $hashed;
echo ($findornot."\n");
echo ($testcase1."\n");
echo ($hashed);
$do=false;
} else {
$array[$testcase1] = $hashed;
}
//print_r(array_values($array));
}while($do)
?>
答案 0 :(得分:0)
<强> TL; DR 强>
$findornot = array_search($hashed, $array, true);
固定。
<强>解释强>
你不会发疯。
关键是&#34;严格比较&#34; - 您已在几个地方正确输入,并使用===
进行自己的比较。
您需要array_search
来做同样的事情。否则,0e1
之类的字符串将根据0e2
匹配array_search
。
The third parameter到array_search
是强制严格比较的可选布尔值。打开它,你的问题就会消失。
更新(以证明)
证明代码(输入):
<?php
$a = "2e1";
$b = "2e2";
var_dump($a == $b);
var_dump($a === $b);
var_dump($a == "20");
var_dump($a === "20");
证明输出:
bool(false)
bool(false)
bool(true)
bool(false)
PHP正在看到&#39; e&#39;字符数字包围的字符,并在类型变换为整数时将其视为指数。
它是PHP的最佳功能之一,也是其最大的失败之一恕我直言。呃,好吧!有人在C中编码吗?