python中可用的最短哈希(可用於文件名形式,如十六進制摘要)是什麼?我的應用程序想爲某些對象保存緩存文件。這些對象必須具有唯一的repr(),以便它們用於「種子」文件名。我想爲每個對象生成一個可能唯一的文件名(不是那麼多)。它們不應該相互碰撞,但是如果它們做了我的應用程序,那麼這個對象就會缺少緩存(並且必須重新索引該對象的數據,這對應用程序來說是一個小的代價)。Python中用於命名緩存文件的最短哈希
因此,如果發生一次衝突,我們會丟失一個緩存文件,但這是緩存所收集的所有對象的節省,使得應用程序啓動速度更快,所以沒關係。
現在我實際上使用abs(hash(repr(obj)));沒錯,字符串hash!還沒有發現任何碰撞,但我想有一個更好的散列函數。 hashlib.md5在Python庫中可用,但如果放入文件名中,十六進制文件非常長。替代方案,具有合理的碰撞阻力?
編輯: 用例如下: 數據加載器獲取數據攜帶對象的新實例。獨特的類型有獨特的repr。因此如果存在hash(repr(obj))
的緩存文件,則取消該緩存文件的替換,並將未替代對象替換爲obj。如果發生衝突並且緩存是錯誤匹配,我會注意到。因此,如果我們沒有緩存或者有錯誤匹配,我會改爲初始化obj(重新加載它的數據)。
結論(?)
的str
散列蟒蛇可能是不夠好,我只是擔心它的抗碰撞性。但是如果我可以用它來散列2**16
對象,它將會不夠好。
我發現瞭如何把一個十六進制哈希(從任何散列源)和使用Base64壓縮存儲它:
# 'h' is a string of hex digits
bytes = "".join(chr(int(h[i:i+2], 16)) for i in xrange(0, len(h), 2))
hashstr = base64.urlsafe_b64encode(bytes).rstrip("=")
爲什麼你關心文件名的長度?這根本不重要,除非你使用的是愚蠢的文件系統 – 2009-08-19 22:59:42
這很醜陋。所有程序員都希望用更多的方式來表達,而在這裏我知道我可以,一個完整的加密散列是矯枉過正的。 – u0b34a0f6ae 2009-08-19 23:14:08
在結束的例子中,對於python hashlib hash,當然可以使用bytes =(..)。digest()。 – u0b34a0f6ae 2009-08-20 15:50:36