Python中的散列(隐藏)字符串
我需要的是散列一个字符串。它不必是安全的,因为它只是文本文件中的一个隐藏短语(它不需要人眼识别) 它不应该只是一个随机字符串,因为当用户键入字符串时,我希望对其进行散列,并将其与已经散列的字符串(来自文本文件)进行比较 对于这个目的,什么是最好的?可以使用内置类完成吗?只需使用内置函数,例如:Python中的散列(隐藏)字符串,python,string,encryption,hash,Python,String,Encryption,Hash,我需要的是散列一个字符串。它不必是安全的,因为它只是文本文件中的一个隐藏短语(它不需要人眼识别) 它不应该只是一个随机字符串,因为当用户键入字符串时,我希望对其进行散列,并将其与已经散列的字符串(来自文本文件)进行比较 对于这个目的,什么是最好的?可以使用内置类完成吗?只需使用内置函数,例如: s = 'a string' hash(s) => -8411828025894108412 您只需使用base64模块即可实现您的目标: >>> import base64 &
s = 'a string'
hash(s)
=> -8411828025894108412
您只需使用base64模块即可实现您的目标:
>>> import base64
>>> a = 'helloworld'
>>> encoded_str = base64.encodestring(a)
>>> encoded_str
'aGVsbG93b3JsZA=='
>>> base64.decodestring(encoded_str)
'helloworld'
>>>
当然,您也可以使用hashlib模块,它更安全,因为散列字符串不能(或很难)在以后解码,但是对于您的问题base64就足够了--“它不一定要安全”首先,我要说的是,您不能保证唯一的结果。如果您想为宇宙中的所有字符串获得唯一的结果,最好存储字符串本身(或压缩版本) 马上就有更多。让我们先做一些散列 hashlib方法 您可以使用任何主要加密哈希值,通过以下几个步骤对字符串进行哈希:
>>> import hashlib
>>> sha = hashlib.sha1("I am a cat")
>>> sha.hexdigest()
'576f38148ae68c924070538b45a8ef0f73ed8710'
就内置而言,您可以在SHA1、SH224、SH256、SH384、SH512和MD5之间进行选择
这些散列算法之间有什么区别?
哈希函数的工作原理是将可变长度的数据转换为固定长度的数据
对于内置在hashlib
中的每个SHA算法,固定长度是名称中指定的位数(sha1除外,sha1为160位)。如果您希望更好地确定两个字符串不会在同一个bucket中结束(相同的哈希值),请选择具有更大摘要(固定长度)的哈希
按排序顺序,这些是您必须处理的摘要大小:
Algorithm Digest Size (in bits)
md5 128
sha1 160
sha224 224
sha256 256
sha384 384
sha512 512
摘要越大,发生冲突的可能性就越小,前提是哈希函数是值得的
等等,hash()
怎么样?
内置的hash()。但也有一些问题
>>> hash('moo')
6387157653034356308
如果您的程序要在不同的系统上运行,您不能确定散列
将返回相同的内容。事实上,我正在使用64位Python在64位机器上运行。这些值将与32位Python的值大不相同
对于Python3.3+,正如所指出的,hash()
在运行之间是随机的。它只运行一次就可以了,但几乎肯定不能跨程序运行(从您提到的文本文件中提取)
为什么要以这种方式构建hash()
?好吧,内置散列是有一个特定原因的。哈希表/字典/内存中的查找表。不是用于加密,而是用于运行时的廉价查找
不要使用hash()
,使用hashlib
请注意,Python的字符串哈希不是“定义的”——它可以而且确实随版本和实现而变化。因此,存储Python字符串哈希将带来困难。CPython的字符串散列也没有试图变得“模糊”
一种标准的方法是使用为这类事情设计的哈希函数。像这样:
>>> import hashlib
>>> encoded = hashlib.sha1("abcdef") # "abcdef" is the password
>>> encoded.hexdigest()
'1f8ac10f23c5b5bc1167bda84b833e5c057a77d2'
这个十六进制数字的长字符串就是“散列”。SHA-1是一个“强”散列函数。如果您发现两个字符串散列为相同的值,您可能会出名;-)给定相同的输入,它将在所有Python版本和实现的所有平台上返回相同的“hexdigest”。这会为每个字符串生成唯一的数字吗?它能被解码吗(只是好奇)?@Lucas,一个固定大小的散列函数不可能为所有可能的字符串返回不同的值。例如,如果哈希函数返回2位,则它只有4个可能的值。@不,哈希不能被“解码”。如果两个对象相等,则其散列相等;但是,许多对象可以(在字符串的情况下将)解析为相同的哈希值。这是一个坏主意。请参阅我对其他答案的评论Python 2中字符串哈希冲突的示例描述为:您真正的问题是什么?有很多散列算法,bset方法取决于如何使用散列字符串。默认情况下,base64
是否附带Python2.3(是的,我知道它的奇数)?是的!在Python2.3中运行上述代码是可以的。自从Python3.3 ie以来,hash()在两次运行之间是随机的。您只能依靠它在一个程序的一次运行中返回相同的值。感谢@gnibbler,我不知道它在两次运行之间不稳定。特别是因为Python3.3hash(somestring)
在两次运行之间是不同的