首先,让我说你不能保证唯一的结果。如果您想要宇宙中所有字符串的唯一结果,最好存储字符串本身(或压缩版本)。
稍后会详细介绍。让我们先获取一些哈希值。
hashlib 方式
您可以通过几个步骤使用任何主要的加密散列来散列字符串:
>>> import hashlib
>>> sha = hashlib.sha1("I am a cat")
>>> sha.hexdigest()
'576f38148ae68c924070538b45a8ef0f73ed8710'
就内置而言,您可以在 SHA1、SHA224、SHA256、SHA384、SHA512 和 MD5 之间进行选择。
这些哈希算法有什么区别?
哈希函数通过获取可变长度的数据并将其转换为固定长度的数据来工作。
对于每个内置于hashlib 的 SHA 算法,固定长度是名称中指定的位数(sha1 除外,它是 160 位)。如果您想更好地确定两个字符串不会最终出现在同一个存储桶中(相同的哈希值),请选择具有更大摘要(固定长度)的哈希。
按排序顺序,这些是您必须使用的摘要大小:
Algorithm Digest Size (in bits)
md5 128
sha1 160
sha224 224
sha256 256
sha384 384
sha512 512
摘要越大,发生冲突的可能性就越小,前提是您的哈希函数物有所值。
等等,hash() 呢?
内置的hash() 函数返回整数,这也可以很容易地用于您概述的目的。不过也有问题。
>>> hash('moo')
6387157653034356308
如果你的程序要在不同的系统上运行,你不能确定hash 会返回同样的东西。事实上,我正在使用 64 位 Python 的 64 位机器上运行。这些值将与 32 位 Python 大不相同。
对于 Python 3.3+,正如@gnibbler 指出的那样,hash() 在运行之间是随机的。它适用于单次运行,但几乎肯定不会跨程序运行(从您提到的文本文件中提取)。
为什么hash() 会这样构建?好吧,内置哈希是出于一个特定的原因。哈希表/字典/在内存中查找表。不是用于加密,而是用于在运行时进行廉价查找。
不要使用hash(),使用hashlib。