0

我正在尝试将一个 php 应用程序转换为一个 python 应用程序,但我被困在了哈希值上

使用 MySQL 和 SQLAlchemy 有 ORM

MySQL

field : client_hash
type : varchar(20)
collation: Latin1_bin

SQL炼金术

client_hash = Column(Unicode)

我尝试过其他类型,例如 varchar,但它似乎给了我比我正在寻找的更远的哈希值。

当我在 phpmyadmin 中查看 has 时,它看起来像

ù3×þØc(    7JûìÎËþf–E”

我从客户端得到这个哈希

\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94

并且服务器将此作为正确答案除外

\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d

我不确定如何将最后两个转换为十六进制,或者它们是否相同。

4

1 回答 1

1

最后两个一样。第一个十六进制序列是 Python 字节字符串的原始表示;它从 Latin-1 解码为:

>>> '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'
>>> print '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
ù3×þØc( 7JûìÎËþfE

但你的第二个值是一个unicode字符串;它使用 Python \uxxxxunicode 代码点转义:

>>> u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
>>> print u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
ù3×þØc( 7JûìÎËþf–E”

因此,Unicode 文字值确实与您在 phpmyadmin 中看到的匹配。

除了最后 3 个字符外,其他都是相同的:

>>> latin1 = '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
>>> unicode_literal = u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
>>> latin1[:-3] == unicode_literal[:-3]
True
>>> latin1[-2] == unicode_literal[-2]
True
>>> latin1[-1] == unicode_literal[-1]
False
>>> latin1[-3] == unicode_literal[-3]
False

如果没有更多信息,很难说出您的 MySQL 设置返回的原因\x96,而\x94不是\u2013\u201d代码点;我没有直接看到那里的相关性。

您可能需要配置 SQLAlchemy 连接器以匹配此 MySQL 数据库中使用的编码,charset如果需要,在数据库连接级别、表级别甚至列级别设置参数。

于 2013-06-19T12:22:28.773 回答