3

仅出于调试目的,我想将一个大字符串(一个难以可视化的 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

3 回答 3

8

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

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

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

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

PS:任何算法都可以;MD5 的计算成本略低,但hashlib.sha256也是一种流行的选择。

于 2012-12-24T16:05:47.120 回答
7
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模块,所以在使用这个函数之前一定要导入它。

于 2012-12-24T16:02:54.127 回答
1

我发现了这个类似的问题: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]
于 2012-12-24T16:05:39.113 回答