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