哈希非ASCII Python字符串
我正在尝试用Python的正则表达式从一个文件中提取一些字符串,然后用类似下面的方式对这个字符串进行MD5加密:
#MD5er.py
salt = extract_salt(file_foo)
print 'salt: %s' % salt
from md5 import md5
print 'hash: %s' % md5(salt).hexdigest()
$python MD5er
salt: \0001\072\206\277\354\107\134\061\361\076\150\047\010\124\200\315\100
hash: ce24166858853dfb12a86d7d602b0638
但是,当我在iPython中这样做时:
In [40]: salt = '\0001\072\206\277\354\107\134\061\361\076\150\047\010\124\200\315\100'
In [41]: salt
Out[41]: "\x001:\x86\xbf\xecG\\1\xf1>h'\x08T\x80\xcd@"
In [42]: print salt
1:���G\1�>hT��@
In [43]: from md5 import md5
In [44]: md5(salt).hexdigest()
Out[44]: 'ebae47a953591f7448ff7079837fb534'
有没有人知道为什么在这两种情况下得到的MD5值不同?还有为什么在iPython中,当我输入变量名时,它的显示格式和原始字符串不一样,而用print()输出又是另一种格式呢?
提示:
In [53]: import sys
In [54]: sys.getdefaultencoding()
Out[54]: 'ascii'
1 个回答
4
第一个例子中的字符串就是你看到的打印出来的内容:
>>> salt = '\\0001\\072\\206\\277\\354\\107\\134\\061\\361\\076\\150\\047\\010\\
124\\200\\315\\100'
>>> md5(salt).hexdigest()
'ce24166858853dfb12a86d7d602b0638'
注意我如何对反斜杠进行了转义,这样数字就不会被当作八进制字节值来解释。
第一个例子中的字符串就是你看到的打印出来的内容:
>>> salt = '\\0001\\072\\206\\277\\354\\107\\134\\061\\361\\076\\150\\047\\010\\
124\\200\\315\\100'
>>> md5(salt).hexdigest()
'ce24166858853dfb12a86d7d602b0638'
注意我如何对反斜杠进行了转义,这样数字就不会被当作八进制字节值来解释。
编辑:
假设你想从这个列表中的八进制值创建一个字节字符串:
data = ['\\0001', '\\072', '\\206', '\\277', '\\354', '\\107', '\\134',
'\\061', '\\361', '\\076', '\\150', '\\047', '\\010', '\\124',
'\\200', '\\315', '\\100']
你可以先把它转换成整数,然后再把字符连接起来,但这和你在IPython中得到的结果是不同的。第一个值是4位而不是3位。它应该被视为'\0'后面跟着一个ASCII的'1',还是应该被视为'\1'呢?下面的代码实现了后者:
salt = ''.join(chr(int(d[1:], 8)) for d in data)
print repr(salt)
print md5(salt).hexdigest()
输出:
"\x01:\x86\xbf\xecG\\1\xf1>h'\x08T\x80\xcd@"
d2092426d1bd5bec1579c8b7ed9c73c2