0

好吧,我需要比较两个字符串,或者至少找到从一个字符串到另一个字符串的字符序列。这两个字符串包含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

因此!有一个匹配项dlmd5origmd5但不知何故找不到它......我在某处做错了什么......请帮帮我:/

4

3 回答 3

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 回答
0

给定输入:

原始 md5 是 ['0430f244a18146a0815aa1dd4012db46', '0430f244a18146a0815aa1dd40 12db46', '59739CCDA2F15D5AC16DB6695CAE3378']

下载器文件 md5 为 59739ccda2f15d5ac16db6695cae3378

你有两个问题。

首先,第一个不仅仅是一个 MD5,而是一个 MD5 和另外两个东西。

要解决这个问题:如果您知道它origmd5总是采用这种格式,只需使用origmd5[2]而不是origmd5. 如果您不知道是什么origmd5,除了其中的一件事是实际的 MD5,您将不得不与所有元素进行比较。

其次,实际的 MD5 值都是表示相同二进制数据的十六进制字符串,但它们是不同的十六进制字符串(因为一个是大写的,另一个是小写的)。您可以通过只进行不区分大小写的比较来解决此问题,但是将它们都解开并比较二进制值可能更可靠。

事实上,如果您正确地复制和粘贴了输出,那么这些十六进制字符串中至少有一个在其中间有一个空格,因此您实际上需要在十六进制对之间使用可选空格来取消十六进制字符串。AFAIK,没有执行此操作的 stdlib 函数,但您可以一步自己编写:

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

同时,我不确定您为什么要尝试使用difflib.SequenceMatcher。两个略有不同的 MD5 哈希指的是完全不同的原始来源;这就是 MD5 和加密哈希函数的全部意义所在。没有 95% 的匹配。要么匹配,要么不匹配。

因此,如果您知道第三个值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 回答