几个小时以来,我一直在研究在 Django 身份验证中使用电子邮件地址而不是用户名的最佳方式。这个话题已经讨论了很多次,但给出的结果不一致。
1) 答案 here指向 snippet只需在其中包含一个“@”字符即可区分用户名和电子邮件。电子邮件和用户名的最大长度不相等,但不在答案中考虑。
2) 第二个答案 - 来自同一个 link - 来自 S.Lott(13 票)正在使用 admin.site 做一些黑魔法。代码的作用对我来说没有意义,这是短小精悍的公认方式吗?
3) 然后我找到this solution ,这看起来几乎是完美的(对我来说很有意义):
username = uuid.uuid4().hex[:30]
它仅选择 Python 生成的唯一 ID 的前 30 个字符作为用户名。但仍有碰撞的可能。然后我看到一个帖子有人声称
A base64 encoding of an md5 hash has 25 characters
如果那是真的,难道我们不能采用 电子邮件地址 的 md5 散列的 base64 编码并保证 100% 唯一的用户名,这些用户名也少于 30 个字符吗?如果这是真的,这是如何实现的?
非常感谢,
最佳答案
你可以这样做:
>>> from hashlib import md5
>>> h = md5('email@example.com').digest().encode('base64')[:-1]
>>> _
'Vlj/zO5/Dr/aKyJiOLHrbg=='
>>> len(h)
24
您可以忽略最后一个字符,因为它只是一个新行。碰撞几率与MD5哈希一样,用base64编码不会丢失信息。
>>> original = md5('email@example.com').digest()
>>> encoded = original.encode('base64')
>>> original == encoded.decode('base64')
True
关于python - Django:电子邮件地址的 md5 哈希的 Base64 是否小于 30 个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11089590/