【问题标题】:A Confusing Case in PythonPython中一个令人困惑的案例
【发布时间】:2012-12-05 03:36:53
【问题描述】:

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

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

【问题讨论】:

  • 你确定字符串是一样的吗?
  • 肯定是一样的

标签: python pyqt4


【解决方案1】:

问题是您传递给md5 QString,而不是常规的Python 字符串。从一些实验中,我可以看到 Python 中的常规字符串和 unicode 字符串都会产生相同的结果 - 从 here 我可以看出它尝试使用 @987654325 将 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 表示,产生不同的输出。

因此,这里的教训是,在对文本执行任何散列之前,您必须在将其传递给散列函数之前明确选择其编码 - 这仅适用于字节 - 因为 there ain't no such thing as plain text


编辑:它不适用于 UTF-16 表示(否则您会得到与

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

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

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2012-09-22
    • 1970-01-01
    • 2020-05-17
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多