Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的散列(隐藏)字符串_Python_String_Encryption_Hash - Fatal编程技术网

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.3
    hash(somestring)
    在两次运行之间是不同的