Python中的一个令人困惑的案例

时间:2012-12-18 00:06:59

标签: python pyqt4

我是pyqt的新手,有些东西我没有得到。我使用hashlib创建了一个应用程序,当然还有gui和pyqt。

 self.pushButton.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.clickedButton)

然后点击按钮:

def clickedButton(self):
        if self.comboBox.currentText() == "MD5":
            self.MD5(self.lineEdit.text())

和MD5:

 def MD5(self,text):
        self.hash = hashlib.md5(text).hexdigest()
        self.textEdit.setText(self.hash)

“你好”的结果: a6f145a01ad0127e555c051d15806eb5

没有错误。看起来没问题。但是在python shell上尝试相同的事情:

 >>> print hashlib.md5("hello").hexdigest()
 5d41402abc4b2a76b9719d911017c592
 >>> 

这是一个错误还是为什么我会得到不同的结果?

1 个答案:

答案 0 :(得分:3)

问题是你传递的是md5 QString,而不是普通的Python字符串。从一些实验中,我可以看到Python中的常规字符串和unicode字符串产生相同的结果 - 来自here我可以告诉它尝试将unicode版本转换为一系列“窄”字符使用ascii编解码器。

>>> print hashlib.md5("hello").hexdigest()
5d41402abc4b2a76b9719d911017c592
>>> print hashlib.md5(u"hello").hexdigest()
5d41402abc4b2a76b9719d911017c592

相反,QString会以不同的方式进行哈希处理:

>>> a=PyQt4.QtCore.QString("hello")
>>> print hashlib.md5(a).hexdigest()
a6f145a01ad0127e555c051d15806eb5

虽然它的UTF-8或Latin 1表示(两者都与ascii编解码器的输出相同,因为我们只处理字母字符)的散列方式与Python字符串相同:< / p>

>>> print hashlib.md5(a.toUtf8()).hexdigest()
5d41402abc4b2a76b9719d911017c592
>>> print hashlib.md5(a.toLatin1()).hexdigest()
5d41402abc4b2a76b9719d911017c592

这里发生的事情可能是哈希算法正在研究QString的内部表示,它是UTF-16,显然不同于UTF-8表示,产生不同的输出。

因此,这里的教训是,在对文本执行任何散列之前,必须先明确选择其编码,然后再将其传递给散列函数 - 该函数仅使用字节 - 从there ain't no such thing as plain text开始。


编辑 :它不能处理UTF-16表示(否则你会得到与

相同的结果)
>>> print hashlib.md5(u'hello'.encode('utf_16')).hexdigest()
25af7f84a93a6cf5cb00967c60910c7d

)但是在其他方面;仍然,重点是hashlib不被认为与QString一起使用,因此它会产生一些“奇怪的”输出。同样,在使用它之前,将QString转换为一个适当编码的窄字符串。