将字符串廉价映射到小的固定长度字符串

时间:2012-12-24 15:53:38

标签: python

仅仅为了调试目的,我想将一个大字符串(一个难以可视化的session_id)映射到一个,比方说,6个字符“hash”。这个哈希不需要以任何方式保证安全,只需要便宜的计算,以及固定和缩短的长度(md5太长)。输入字符串可以有任何长度。

你如何在python中实现这个“cheap_hash”,这样计算起来并不昂贵?它应该生成这样的东西:

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

print compute_cheap_hash("SDFSGSADSADFSasdfgsadfSDASAFSAGAsaDSFSA2345435adfdasgsaed")
aBxr5u

3 个答案:

答案 0 :(得分: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模块,所以在使用这个函数之前一定要导入它。

答案 1 :(得分:4)

我不记得MD5是否均匀分布,但它的设计即使输入中的最小差异也会发生很大变化。

不要相信我的数学,但我猜测MD5 hexdigest的前6位数的碰撞几率为2 ^ 64。

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

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

PS:可以使用任何算法; MD5的计算成本稍低,但hashlib.sha256也是一种受欢迎的选择。

答案 2 :(得分: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]