2014-04-01 70 views
1

所以,我有兩個文件 在第一個文件中,有 文本:哈希用PHP合併文件

在其他文件中,有 哈希:通過

我寫了一些代碼來匹配哈希,然後打印文本(所以當運行時,我會得到一個文本輸出:通過) 它工作正常,它可以找到所有的信息,但有時它會跳過某些,只是沒有找到任何東西。 (如果我手動去做,數據就在那裏)所以我不確定爲什麼它會找到大部分但不是全部。無論如何,我希望有人能幫忙,代碼如下:

<?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

嵌套的foreach,你的條件,如果僅第一的foreach完成自身運行後,之後的第二的foreach完成本身,那麼你的條件會工作。清楚了嗎? – B4NZ41

+1

沒有真正面向對象的。 介意幫助? – user3426906

+0

是的,當然!)看看我的答案。 – B4NZ41

回答

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; 
} 

看看這個 - >http://br1.php.net/MultipleIterator

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的大O複雜^ 2 [1000行這將需要1次000 000迭代] 不嵌套的foreach一個具有2n個的複雜度。 [這將需要2000次迭代]。試着找到一個解決方案:)

無論如何,在這兩個地方都有一個問題,因爲你可以有一個哈希碰撞(兩個不同的電子郵件,你可以有相同的哈希,然後所有電子郵件,你會打印出相同(可能是錯誤的密碼)。

+0

試過這個,仍然是相同的結果:s – user3426906

+0

更多幫助將不勝感激:/ – user3426906

+0

然後檢查$ hash和$ hash2變量,也許你錯誤地解析它們 – PolishDeveloper