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 シェルで同じことを試しています。

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

これはエラーですか、それとも異なる結果が得られるのはなぜですか?

4

1 に答える 1

3

問題は、通常の Python 文字列ではなく、 に渡していることですmd5QStringいくつかの実験から、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 に答える