php array_search返回非匹配元素

时间:2015-12-19 20:22:56

标签: php arrays search

当我尝试使用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)
?>

1 个答案:

答案 0 :(得分:0)

<强> TL; DR

$findornot = array_search($hashed, $array, true);

固定。

<强>解释

你不会发疯。

关键是&#34;严格比较&#34; - 您已在几个地方正确输入,并使用===进行自己的比较。

您需要array_search来做同样的事情。否则,0e1之类的字符串将根据0e2匹配array_search

The third parameterarray_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中编码吗?