使用 php 合并文件


Merging files with php

所以,我有两个文件在第一个文件中,有文本:哈希

在另一个文件中有哈希:传递

我写了一些代码来匹配哈希,然后打印文本(所以当运行时,我会得到 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 次迭代]。尝试为该:)找到解决方案

无论如何,在这两个地方都有一个问题,因为您可能会发生哈希冲突(对于两封不同的电子邮件,您可以使用相同的哈希值,然后对于所有电子邮件,您将打印出相同的哈希值(可能是错误的密码)。