我正在尝试将php应用程序转换为python应用程序,并且我陷入了哈希
使用MySQL和SQLAlchemy有ORM
的MySQL
field : client_hash
type : varchar(20)
collation: Latin1_bin
SQLAlchemy的
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
我不确定如何将最后两个转换为十六进制或者它们是否相同。
答案 0 :(得分: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 \uxxxx
unicode codepoint escapes:
>>> 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
参数。