我需要的是对字符串进行哈希处理。因为它只是作为文本文件中的隐藏短语,所以不必过于安全(它只需不可被人眼辨认)。
这应该不仅仅是随机字符串,因为当用户键入该字符串时,我想将其哈希处理并将其与已哈希处理后的字符串(来自文本文件)进行比较。
对于这个目的,最好的方法是什么?它可以使用内置类完成吗?
我需要的是对字符串进行哈希处理。因为它只是作为文本文件中的隐藏短语,所以不必过于安全(它只需不可被人眼辨认)。
这应该不仅仅是随机字符串,因为当用户键入该字符串时,我想将其哈希处理并将其与已哈希处理后的字符串(来自文本文件)进行比较。
对于这个目的,最好的方法是什么?它可以使用内置类完成吗?
首先,我要说的是,你无法保证唯一的结果。如果你想对宇宙中所有字符串都实现唯一的结果,最好存储字符串本身(或者是压缩版本)。
稍后再详细解释这一点。让我们首先获取一些哈希值。
你可以使用任何一个主要的加密哈希算法来对一个字符串进行哈希,只需要几个步骤:
>>> 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
。
hash()
函数是随机化的,即在每次运行时都会变化。也就是说,你只能在程序单次运行中依赖于它返回相同的值。 - John La Rooy>>> import base64
>>> a = 'helloworld'
>>> encoded_str = base64.encodestring(a)
>>> encoded_str
'aGVsbG93b3JsZA=='
>>> base64.decodestring(encoded_str)
'helloworld'
>>>
base64
模块?(是的,我知道这很奇怪) - Lucas>>> import hashlib
>>> encoded = hashlib.sha1("abcdef") # "abcdef" is the password
>>> encoded.hexdigest()
'1f8ac10f23c5b5bc1167bda84b833e5c057a77d2'
那一长串十六进制数字就是“哈希”值。SHA-1是一种“强大”的哈希函数。如果你能找到两个字符串的哈希值相同,你可能会出名;-) 并且在所有平台和Python所有版本和实现中,给定相同的输入,它将返回相同的“十六进制摘要”。
hash(somestring)
在不同的运行中是不同的。 - John La Rooy只需使用内置函数hash()
即可,例如:
s = 'a string'
hash(s)
=> -8411828025894108412