我是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
>>>
这是一个错误还是为什么我会得到不同的结果?
答案 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
转换为一个适当编码的窄字符串。