python - Django:电子邮件地址的 md5 哈希的 Base64 是否小于 30 个字符?

标签 python django

几个小时以来,我一直在研究在 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/

相关文章:

python - 改进的 IDE'ish Python 命令行包括代码完成?

python - 使用 python pandas 或任何其他更好的库在工作表中添加一列并在整列中应用此 excel 公式

django - Django manage.py:迁移在依赖之前应用

python - Django - CSRF 验证失败

django - 国际化,切换语言的一些问题

django - 使用扩展 Django 用户模型的代理模型自定义 request.user

python - NumPy 多维数组形状直觉

python - 逐个字符地遍历 csv

python - 根据 pos nlp 对字符串进行词形还原

python - 创建唯一验证 key /号码的方法