文章内容
2023/3/21 14:03:45,作 者: 黄兵
TypeError: Unicode-objects must be encoded before hashing
今天在使用 Python 对字符串生成 MD5 摘要的时候出现了如下错误:
TypeError: Unicode-objects must be encoded before hashing
出现错误的原因:
这个错误通常是由于Python2和Python3之间的编码差异引起的。在Python 3中,所有字符串都是Unicode类型,因此在进行哈希之前,需要将它们编码为字节类型。在Python 2中,字符串类型默认为字节类型,因此通常不需要进行显式编码。
解决方案:
先看错误代码示例:
def crate_paysion_api_sig(self, pm_id, amount, order_id): """ 创建交易签名api_sig(api签名),具体文档可参考此处:https://sandbox.payssion.com/cn/docs/#api-reference-api-signature :param pm_id:支付方式id,具体代码可以参考:https://sandbox.payssion.com/cn/docs/#api-reference-pm-id :param amount:付款金额 :param order_id:订单编号 :return:api_sig """ sig_str = f"{self._api_key}|{pm_id}|{amount}|USD|{order_id}|{self._secret_key}" m = hashlib.md5() m.update(sig_str) api_sig = m.hexdigest() return api_sig
在 Python 3 中,你可以在调用哈希算法之前将 Unicode 字符串编码为字节字符串,例如:
m.update(sig_str.encode('utf-8'))
这将使用 UTF-8 编码将字符串转换为字节类型,然后将其传递给哈希算法进行处理。如果你在其他编码格式中使用字符串,则应将其编码为相应的编码格式。
在 Python 2 中,你不需要显式编码,因为字符串已经是字节类型。但是,如果你在处理包含非 ASCII 字符的字符串时遇到问题,可以尝试使用 Unicode 字符串来代替字节字符串,并将其传递给哈希算法:
sig_str = u"{self._api_key}|{pm_id}|{amount}|USD|{order_id}|{self._secret_key}" m = hashlib.md5() m.update(sig_str) api_sig = m.hexdigest() return api_sig
在这种情况下,你需要确保你的代码在Python 2和Python 3中都可以正常工作。
参考资料:
1、chatGPT 回答
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - TypeError: Unicode-objects must be encoded before hashing
评论列表