所以,我有两个文件 在第一个文件中,有 文本:散列
在另一个文件中有 散列:通
我写了一些代码来匹配哈希,然后打印文本(所以当运行时,我得到一个文本输出:传递) 它工作正常,它找到所有的信息,但有时它会跳过某些信息,只是找不到任何东西。 (如果我去手工做数据就在那里)所以我不确定为什么它会找到大部分而不是全部。无论如何,我希望有人可以提供帮助,代码如下:
<?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);
答案 0 :(得分:0)
您需要迭代迭代器,例如使用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;
}
看看这个 - &gt; http://br1.php.net/MultipleIterator
答案 1 :(得分:0)
此算法效率很低。试着这样做
$ emailhash = file('emailhash.txt'); $ hashpass = file('hashpass.txt'); $ hashToEmail = array(); $ 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的大O复杂度[对于1000行,将需要1 000 000次迭代] 没有嵌套foreach的那个具有2n的复杂性。 [需要2000次迭代]。尝试找到解决方案:)
无论如何,在这两个地方都有一个问题,因为你可以有一个哈希冲突(对于两个不同的电子邮件,你可以有相同的哈希,然后对于所有电子邮件,你将打印出相同的(可能是错误的密码)。