如何使用MD5哈希(或其他二进制数据)作为密钥名称?

Noa*_*ith 5 python google-app-engine google-cloud-datastore

我一直在尝试使用MD5哈希作为AppEngine上的密钥名称,但我写的代码引发了UnicodeDecodeError

from google.appengine.ext import db
import hashlib
key = db.Key.from_path('Post', hashlib.md5('thecakeisalie').digest())
Run Code Online (Sandbox Code Playgroud)

我不想使用,hexdigest()因为它不仅是一个kludge,而是一个劣等的(base64会做得更好).

vz0*_*vz0 12

App Engine Python文档说:

key_name存储为Unicode字符串(str值转换为ASCII文本).

密钥必须是unicode-encodeable-string.您需要将digest()调用更改为hexdigest(),即:

k = hashlib.md5('thecakeisalie').hexdigest()
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 5

使用iso-8859-1解码字节

>>> hashlib.md5('thecakeisalie').digest().decode("iso-8859-1")
u"'\xfc\xce\x84h\xa9\x1e\x8a\x12;\xa5\xb1K\xea\xef\xd6"
Run Code Online (Sandbox Code Playgroud)

这基本上是一个"NOP"转换.它创建一个Unicode对象,它是相同长度的初始字符串,可以仅仅通过转换回字符串.encode("iso-8859-1"),如果你想

  • @bukzor,unicode对象与摘要的大小完全相同,那些_exacty_与摘要相同的字节(记住'\ xfc'是单个字符的repr等),只标记为unicode.hexdigest是一个更长的.它比仅仅执行hexdigest要慢,但是appengine需要`.decode()`str稍后,所以整体上使用hexdigest很可能会更慢. (2认同)