2012-12-24 64 views
1

只爲調試的目的我想映射一個大的字符串(一個很難形象化的session_id)到一個,比如說6個字符的「散列」。這個散列不需要以任何方式保證安全,只需要便宜地計算,並且固定和減少長度(md5太長)。輸入字符串可以有任意長度。字符串到小固定長度字符串的便宜映射

你將如何在python中實現這個「cheap_hash」,以便計算它並不昂貴?它應該產生這樣的:

def compute_cheap_hash(txt, length=6): 
    # do some computation 
    return cheap_hash 

print compute_cheap_hash("SDFSGSADSADFSasdfgsadfSDASAFSAGAsaDSFSA2345435adfdasgsaed") 
aBxr5u 
+4

如果你不擔心碰撞,從MD5的前6個字符。 –

+0

您可以查看校驗和算法,因爲它們通常非常快。 –

+0

並不擔心碰撞。這是在單個運行時間內至多1000個字符串 - 即使有衝突,我只是在調試。我會有點困惑,就是這樣。 – dangonfast

回答

3

我不記得,如果MD5是均勻分佈的,但它的設計甚至改變了很多的輸入中的最小差異。

不要相信我的數學,但我想碰撞機會是從MD5十六進制的前6位數2^64。

所以你可以只cheap_hash = lambda input: hashlib.md5(input).hexdigest()[:6]

之後,你可以在任何地方使用hash = cheap_hash(any_input)

PS:可以使用任何算法; MD5計算稍便宜,但hashlib.sha256也是一種流行的選擇。

5
def cheaphash(string,length=6): 
    if length<len(hashlib.sha256(string).hexdigest()): 
     return hashlib.sha256(string).hexdigest()[:length] 
    else: 
     raise Exception("Length too long. Length of {y} when hash length is {x}.".format(x=str(len(hashlib.sha256(string).hexdigest())),y=length)) 

這應該做你需要它做什麼,它只是使用了hashlib模塊,所以一定要確保使用此功能前將其導入。

0

我發現這個類似的問題:https://stackoverflow.com/a/6048639/647991

因此,這裏的功能:

import hashlib 

def compute_cheap_hash(txt, length=6): 
    # This is just a hash for debugging purposes. 
    # It does not need to be unique, just fast and short. 
    hash = hashlib.sha1() 
    hash.update(txt) 
    return hash.hexdigest()[:length] 
相關問題