2013-07-01 57 views
2

我想散列一個簡單的字符串數組 該文檔說你不能簡單地將字符串送入hashlib的update()函數, 所以我嘗試了一個常規變量,但後來我出現TypeError: object supporting the buffer API required錯誤。在python中散列數組或對象3

這裏是我到目前爲止

def generateHash(data): 
    # Prepare the project id hash 
    hashId = hashlib.md5() 

    hashId.update(data) 

    return hashId.hexdigest() 
+0

據我所知,你應該能夠將一個字符串送入hashlib的更新功能,能你提供更多信息? – Stephan

回答

1

如果您想湊字符串列表,一個天真的解決方案是:

def hash_string_list(string_list): 
    h = hashlib.md5() 
    for s in string_list: # Note that you could use ''.join(string_list) instead 
     h.update(s)  # s.encode('utf-8') if you're using Python 3 
    return h.hexdigest() 

然而,提防['abc', 'efg']['a', 'bcefg']會哈希到相同的值。

如果您提供有關您的目標的更多背景信息,其他解決方案可能更合適。

+0

...除了'update'需要字節,所以如果你有字符串,你需要先編碼它們。 – mata

+0

@mata哦,沒有意識到這是一個python3問題 - 抱歉。 –

1

根據你想要做的,分別獲得所有字符串的散列或每個字符串的散列。你可以得到以下的拳頭托馬斯解決方案 m.update(a); m.update(b) is equivalent to m.update(a+b). 還是後來按照下面的解決方案

def generateHash(data): 
    # Prepare the project id hash 

    return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data] 

注意,它返回一個列表。每個元素都是給定字符串列表中相應元素的散列值

6

可以使用repr()函數來獲取數組(或任何實現向表示的轉換的對象)的(Unicode)字符串表示形式。然後你將字符串編碼爲UTF-8(當使用UTF-8時,字節的順序是相同的)。所生成的字節進行散列如你在上面嘗試:

#!python3 
import hashlib 

def hashFor(data): 
    # Prepare the project id hash 
    hashId = hashlib.md5() 

    hashId.update(repr(data).encode('utf-8')) 

    return hashId.hexdigest() 


if __name__ == '__main__': 
    data1 = ['abc', 'de'] 
    data2 = ['a', 'bcde'] 
    print(hashFor(data1) + ':', data1) 
    print(hashFor(data2) + ':', data2) 

它打印出我的控制檯上:

c:\tmp\___python\skerit\so17412304>py a.py 
d26d27d8cbb7c6fe50637155c21d5af6: ['abc', 'de'] 
dbd5ab5df464b8bcee61fe8357f07b6e: ['a', 'bcde'] 
+1

不能保證任何對象的''__repr__''都會返回對散列函數有用的輸入。 hashlib將自己對象,例如,repr()轉換爲''。即使忽略了這些用於某些密碼操作的惡意含義,這甚至不是確定性的!在不同的時間運行相同的程序不會返回相同的散列值。 –

+0

@EricSeppanen:答案與字符串數組有關。你是對的。每個工作都不應該使用錘子。 – pepr

+0

因爲'__repr__'不能保證與未來版本保持一致,所以你仍然應該嘗試使用'',。。join(data)''。也許Python 4會返回一個稍微不同的字符串(例如's'abc'而不是''abc'')。 –