猿问

替代使用所有 26 个字母的 hexdigest?

我正在编写一个调用各种 API 的应用程序。每个 API 都有自己的日志记录,我想让跟踪所有各种日志文件的事务变得容易。


为此,我在事务开始时创建一个唯一(ish)字符串,记录它,并将该字符串传递给其他 API,以便它们都可以将其包含在日志记录中。


这是我正在使用的代码:


s = '%s %s' % (username, datetime.datetime.now())

token = hashlib.md5(s.encode('utf-8')).hexdigest()

这运行良好,但仍有改进的余地。 hexdigest()(显然)只使用十六进制字符,即0-9和a-f. 如果我偶尔遇到令牌冲突,我不会太在意,但我想尽可能避免它。是否有类似的函数可以使用所有 26 个字母?


千万里不及你
浏览 169回答 2
2回答

慕标琳琳

尝试https://en.wikipedia.org/wiki/Ascii85及其 URL 安全变体以获得更密集的表示。当然,您必须对原始字节进行编码。(此外,从加密的角度来看,MD5 是一个糟糕的选择,SHA2 更好。)

一只名叫tom的猫

您可以对数据进行哈希处理,然后使用 base64 对哈希进行编码,而不是直接获取十六进制摘要:s = '%s %s' % (username, datetime.datetime.now())digest = hashlib.md5(s.encode('utf-8')).digest()token = base64.b64encode(digest)这使用所有 26×2+10 = 62 个字母数字字符,加上+和/。您的实现可能会产生如下内容:d88cc7dea0fee57975187d4b30950f7b用 base64 编码会稍微减少长度:2IzH3qD+5Xl1GH1LMJUPew==然而,如果你想避免冲突,你需要增加摘要的长度——所以使用像 SHA512 这样的散列函数,而不是 MD5,甚至只是生成一个随机数!
随时随地看视频慕课网APP

相关分类

Python
我要回答