2013-10-25 92 views
12

我需要的是哈希一个字符串。它不一定非常安全,因为它只是文本文件中的一个隐藏短语(它不需要人眼识别)。Python中的哈希(隐藏)字符串

它不应该只是一个随机字符串,因为当用户键入字符串时,我想散列它并将其与已经散列的字符串(来自文本文件)进行比较。

什么是最好的这个目的?它可以通过内置的类来完成吗?

+1

什么是你的**真正的**问题?有很多散列算法,bset方法取决于你如何使用散列字符串。 –

回答

32

首先,让我说,你不能保证独特的结果。如果你想要宇宙中所有字符串的独特结果,你最好存储字符串本身(或压缩版本)。

更多关于这一点。我们先来看看哈希。

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 
  1. 如果你的计划是要在不同的系统上运行,你不能确保hash将返回同样的事情。事实上,我正在使用64位Python在64位机器上运行。这些值将与32位Python大不相同。

  2. 对于Python 3.3+,如@gnibbler指出的,hash()是在运行之间随机化的。它将用于单次运行,但几乎肯定不会跨越程序的运行(从您提到的文本文件拉出)。

为什么hash()这样构建?那么,内置哈希是有一个特定的原因。哈希表/字典/查找内存中的表。不是用于加密,而是用于运行时廉价的查找。

请勿使用hash(),请使用hashlib

+4

'hash()'在运行之间随机化Python3.3 ie。你只能依靠它在程序的一次运行中返回相同的值 –

+0

太好了。感谢那个@gnibbler,我不知道它在运行之间不稳定。 –

+2

这篇文章太棒了。包含我需要的所有信息。像你这样的人非常感谢,伙计。 – Lucas

0

只需使用hash()内置的功能,例如:

s = 'a string' 
hash(s) 
=> -8411828025894108412 
+0

这是要为每个字符串生成唯一的数字吗?它可以解码(只是好奇)? – Lucas

+2

@Lucas,固定大小的散列函数不可能为所有可能的字符串返回不同的值。例如,如果散列函数返回2位,则它只有4个可能的值。 –

+0

@Tim Peters它可以解码(只是好奇)? – Lucas

5

您可以简单地使用的base64模块来实现自己的目标:

>>> import base64 
>>> a = 'helloworld' 
>>> encoded_str = base64.encodestring(a) 
>>> encoded_str 
'aGVsbG93b3JsZA==' 
>>> base64.decodestring(encoded_str) 
'helloworld' 
>>> 

当然,你也可以使用的hashlib模块,它更安全,因为散列字符串不能(或非常非常难)被解码,但是对于你的问题,base64就足够了 - “它并不一定非常安全”

+0

默认情况下,base64是否带有Python2.3(是的,我知道它很奇怪)? – Lucas

+0

是的!可以在Python 2.3中运行上面的代码[http://docs.python.org/release/2.3/lib/module-base64.html] – tinylambda

4

请注意,Python的字符串哈希不是“定义”的 - 它可以并且确实在不同版本和实现之间有所不同。因此存储Python字符串散列会产生困难。 CPython的字符串散列也不会试图变得“模糊”。

一个标准的方法是使用散列函数设计这种事情。像这样:

>>> import hashlib 
>>> encoded = hashlib.sha1("abcdef") # "abcdef" is the password 
>>> encoded.hexdigest() 
'1f8ac10f23c5b5bc1167bda84b833e5c057a77d2' 

长的十六进制数字串是“散列”。 SHA-1是一个“强大”散列函数。如果你发现两个字符串散列到相同的值,你可以名声大噪;-)给定相同的输入,它将在Python所有版本和实现的所有平台上返回相同的“hexdigest”。

+1

尤其是因为Python3.3'hash(somestring)'在运行时不同 –