2016-05-09 16 views
3

私は2つのリストを比較するためのpython(2.7)スクリプトを書いています。これらのリストは、その内容を読むことによってファイルから作成されます。ファイルはテキストファイルであり、バイナリファイルではありません。ファイル1はハッシュ(MD5の平文単語の和)のみを含み、ファイル2は平文です。リストは長さが異なります(論理的には、ハッシュよりも「クラックされた」エントリが少なくなります)。どちらもソートできませんが、これは私が達成しようとしている次のステップです。これまでのところ、私の単純なコードは以下のようになります。2つのリスト、速い比較のpython

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import sys 
import os 

def ifexists(fname): 
    if not os.path.isfile(fname): 
     print('[-] %s must exist' % fname) 
     sys.exit(1) 

if len(sys.argv) < 2: 
    print('[-] please provide CRACKED and HASHES files') 
    sys.exit(1) 

CRACKED=sys.argv[1] 
HASHES=sys.argv[2] 

sk_ifexists(CRACKED) 
sk_ifexists(HASHES) 

with open(CRACKED) as cracked, open(HASHES) as hashes: 
    hashdata=hashes.readlines() 
    crackdata=cracked.readlines() 
    for c in crackdata: 
     for z in hashdata: 
      if c.strip().split(':', 1)[0] in z: 
       print('found: ', c.strip().split(':', 1)) 

基本的に、私は、一致する行ハッシュでHASHESリストで見つかったハッシュを交換する必要があります。割れたリストで見つかった平野。私はそれが毎回短くなるので、CRACKEDを繰り返しています。だから私の問題は、上記のコードは非常に長いリストのために遅いです。たとえば、60k行のテキストファイルを2つ処理する場合は、最大15分かかります。それをスピードアップするためのあなたの提案は何ですか?

+0

何c.strip()。split( ':'、1)[0] 'をセットにして別のセットにハッシュし、2つのセットの交差を探します。 – Bahrom

答えて

4

これらのファイルの1つを辞書またはセットに格納します。完全なループを取り、ルックアップは平均でO(1)一定時間です。

with open(CRACKED) as crackedfile: 
    cracked = dict(map(str.strip, line.split(':')) for line in crackedfile if ':' in line) 

、今あなただけ一度他のファイルをループする必要があります:crackdataファイルを簡単に辞書に変換することができますように例えば、それが見えます

with open(HASHES) as hashes: 
    for line in hashes: 
     hash = line.strip() 
     if hash in cracked: 
      print('Found:', hash, 'which maps to', cracked[hash]) 
+0

これは素晴らしいことです。今では、全体の操作(60kレコード)を完了するのに約1秒かかります。ありがとうございました! – zerocool

関連する問題