1

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

 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
 >>> 

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

4

1 回答 1

3

问题是您传递给md5一个QString,而不是一个常规的 Python 字符串。通过一些实验,我可以看到 Python 中的常规字符串和 unicode 字符串都会产生相同的结果 - 从这里我可以看出它尝试使用ascii编解码器将 unicode 版本转换为“窄”字符序列。

>>> 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 字符串的散列方式相同:

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

可能这里发生的事情是散列算法正在处理 的内部表示QString,即 UTF-16,它明显不同于 UTF-8 表示,产生不同的输出。

因此,这里的教训是,在对文本执行任何散列之前,您必须在将其传递给散列函数之前明确选择其编码 - 它仅适用于字节 - 因为没有纯文本之类的东西


编辑:它不适用于 UTF-16 表示(否则你会得到相同的结果

>>> print hashlib.md5(u'hello'.encode('utf_16')).hexdigest()
25af7f84a93a6cf5cb00967c60910c7d

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

于 2012-12-18T00:24:35.117 回答