文章内容

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

分享到:

发表评论

评论列表