0

2つの文字列を比較するか、少なくとも文字列から別の文字列への文字のシーケンスを見つける必要があります。2つの文字列にはmd5、一致するものが見つかった場合に比較して言う必要のあるファイルが含まれています。

私の現在のコードは次のとおりです。

def comparemd5():
    origmd5=getreferrerurl()
    dlmd5=md5_for_file(file_name)
    print "original md5 is",origmd5
    print "downloader file md5 is",dlmd5
    s = difflib.SequenceMatcher(None, origmd5, dlmd5)
    print "ratio is:",s.ratio()

私が得る出力は次のとおりです。

original md5 is ['0430f244a18146a0815aa1dd4012db46', '0430f244a18146a0815aa1dd40
12db46', '59739CCDA2F15D5AC16DB6695CAE3378']

downloader file md5 is 59739ccda2f15d5ac16db6695cae3378

ratio is : 0.0

したがって!dlmd5からの一致がありますがorigmd5、どういうわけかそれが見つかりません...私はどこかで何か間違ったことをしています...私を助けてください:/

4

3 に答える 3

0

入力が与えられた場合:

元のmd5は['0430f244a18146a0815aa1dd4012db46'、 '0430f244a18146a0815aa1dd40 12db46'、 '59739CCDA2F15D5AC16DB6695CAE3378']

ダウンローダーファイルmd5は59739ccda2f15d5ac16db6695cae3378です

2つの問題があります。

まず第一に、その最初のものはMD5だけでなく、MD5と他の2つのものです。

これを修正するには:それorigmd5が常にこの形式になることがわかっている場合は、origmd5[2]の代わりにを使用してorigmd5ください。その中の1つが実際のMD5であることを除いて、何であるかわからない場合origmd5は、すべての要素と比較する必要があります。

次に、実際のMD5値は両方とも同じバイナリデータを表す16進文字列ですが、異なる16進文字列です(一方が大文字で、もう一方が小文字であるため)。大文字と小文字を区別しない比較を行うだけでこれを修正できますが、両方を非16進化し、バイナリ値を比較する方がおそらくより堅牢です

実際、出力を正しくコピーして貼り付けた場合、それらの16進文字列の少なくとも1つはその中央にスペースがあるため、実際には、16進ペアの間にオプションのスペースを入れて16進文字列を非16進化する必要があります。AFAIK、これを行うstdlib関数はありませんが、1つのステップで自分で作成できます。

def unhexlify(s):
    return binascii.unhexlify(s.replace(' ', ''))

その間、なぜあなたがdifflib.SequenceMatcherまったく使用しようとしているのかわかりません。2つのわずかに異なるMD5ハッシュは、完全に異なる元のソースを参照します。これがMD5の要点であり、一般的な暗号化ハッシュ関数です。95%一致するようなものはありません。一致または不一致のいずれかがあります。

したがって、の3番目の値が必要な値であることがわかっている場合は、次のようにorigmd5します。

s = unhexlify(origmd5[2]) == unhexlify(dlmd5)

それ以外の場合は、次のようにします。

s = any(unhexlify(origthingy) == unhexlify(dlmd5) for origthingy in origmd5)

または、簡単にするために向きを変えます。

s = unhexlify(dlmd5) in map(unhexlify, origthingy)

または、最も読みやすいと思われる同等のもの。

于 2013-03-14T18:31:14.640 に答える
0

基本的に、 idom が必要です if test_string in list_of_strings。大文字と小文字を区別する必要がないように見えるので、

if test_string.lower() in (s.lower() for s in list_of_strings)

あなたの場合:

>>> originals = ['0430f244a18146a0815aa1dd4012db46', '0430f244a18146a0815aa1dd40 12db46', '59739CCDA2F15D5AC16DB6695CAE3378']
>>> test = '59739ccda2f15d5ac16db6695cae3378'
>>> if test.lower() in (s.lower() for s in originals):
...    print '%s is match, yeih!' % test
... 
59739ccda2f15d5ac16db6695cae3378 is match, yeih!
于 2013-03-14T18:26:07.047 に答える
0

大文字と小文字が一致していないため、問題が発生しているようです。試してみたいことがあります:

def comparemd5():
    origmd5=[item.lower() for item in getreferrerurl()]
    dlmd5=md5_for_file(file_name)
    print "original md5 is",origmd5
    print "downloader file md5 is",dlmd5
    s = difflib.SequenceMatcher(None, origmd5, dlmd5)
    print "ratio is:",s.ratio()
于 2013-03-14T18:29:03.533 に答える