簡體   English   中英

散列非ascii Python字符串

[英]Hashing non-ascii Python string

我正在嘗試使用python re從文件中提取一些字符串,然后使用類似以下內容的MD5ing這個字符串:

    #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' 

第一種情況下的字符串與您看到的完全相同:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM