所以,我有两个文件在第一个文件中,有文本:哈希
在另一个文件中有哈希:传递
我写了一些代码来匹配哈希,然后打印文本(所以当运行时,我会得到 text:pass 的输出)它工作正常,可以找到所有信息,但是有时它会跳过某些信息,只是找不到任何东西。(如果我去手动做,数据就在那里)所以我不确定为什么它会找到其中的大多数,但不是全部。无论如何,我希望有人可以提供帮助,代码如下:
<?php
$emailhash = file('emailhash.txt');
$hashpass = file('hashpass.txt');
$list = '';
foreach($emailhash as $data) {
$data = str_replace("'r'n",'', $data);
$array_emailhash = explode(":", $data);
$email = $array_emailhash[0];
$hash = $array_emailhash[1];
foreach($hashpass as $data2) {
$data2 = str_replace("'r'n",'', $data2);
$array_hashpass = explode(":", $data2);
$hash2 = $array_hashpass[0];
$pass = $array_hashpass[1];
if($hash2 == $hash)
$list .= $email.':'.$pass."'r'n";
}
}
file_put_contents('emailpass.txt', $list);
您需要迭代迭代器,例如使用 multipleIterator
,因为您将整个文件读取到数组中,请这样做。
$iterator = new MultipleIterator();
$iterator->attachIterator( new ArrayIterator( $emailhash ));
$iterator->attachIterator( new ArrayIterator( $hashpass ));
foreach( $iterator as $value ) {
list($keys1, $keys2) = $iterator->key();
list($value1, $value2) = $value;
}
看看这个 -> http://br1.php.net/MultipleIterator
这种算法效率非常低。 尝试这样做
$emailhash = file('emailhash.txt'); $hashpass = 文件('哈希传递.txt'); $hashToEmail = 数组(); $list = '';
foreach($emailhash as $data) {
$data = str_replace("'r'n",'', $data);
$array_emailhash = explode(":", $data);
$email = $array_emailhash[0];
$hash = $array_emailhash[1];
$hashToEmail[$hash] = $email;
}
foreach($hashpass as $data2) {
$data2 = str_replace("'r'n",'', $data2);
$array_hashpass = explode(":", $data2);
$hash2 = $array_hashpass[0];
$pass = $array_hashpass[1];
if (array_key_exists($hash2, $hashToEmail)) {
$list .= $hashToEmail[$hash2].':'.$pass."'r'n";
} else {
//what to do if you don't have that password hash
}
}
您的设计具有 n^2 的 Big O 复杂度 [对于 1000 行,将需要 1 000 000 次迭代]没有嵌套的 foreach 的复杂度为 2n。 [这将需要 2000 次迭代]。尝试为该:)找到解决方案
无论如何,在这两个地方都有一个问题,因为您可能会发生哈希冲突(对于两封不同的电子邮件,您可以使用相同的哈希值,然后对于所有电子邮件,您将打印出相同的哈希值(可能是错误的密码)。