基于邮箱生成Python UUID
3 个回答
正如其他人所说的,你需要使用uuid3或uuid5。选择哪个其实没太大关系,如果你不太在意加密方面的问题。这里我用uuid3作为例子。接下来,你需要决定一个命名空间。
DNS不太合适,因为它只接受完全合格的域名(FQDN),而电子邮件地址显然不是。理论上,如果你在使用LDAP,可以用X.500,但这还是比必要的复杂得多。根据我所知,OID树没有针对电子邮件的部分,这也是对的,因为他们想建立一个永久性的注册,而电子邮件地址并不是真正的永久性。
所以,剩下的就是URI了。电子邮件地址算不算URI呢?幸运的是,算。虽然从正式上讲,它只针对URL,但幸运的是,电子邮件地址也是URL。URI的语法在这篇维基百科文章中有描述。所以你需要找到一个方案,然后把你的数据放进去。IANA提供了一个方案列表,你可以在里面找到“mailto”,它被标记为“电子邮件地址”的“永久”方案。看起来正是我们想要的。
你还可以找到RFC的链接,这里是RFC 6068,它告诉你应该如何格式化你的电子邮件地址。可能的问题是,你提到的“电子邮件ID”,这可能只是指它的“本地部分”(通常称为“用户名”)。当然,这样是不行的,因为它在全球范围内并不唯一。
[唯一能让它有效的方法是将命名空间限制在你的邮件服务器上。你可以通过MX记录和DNS来做到这一点,但更简单的方法是直接把域名编码到整个电子邮件地址中。]
def email_uuid(email_id, domain='your.domain.example.com'):
from uuid import uuid3, NAMESPACE_URL
if '@' not in email_id:
email_id += '@' + domain
return uuid3(NAMESPACE_URL, 'mailto:' + email_id)
你需要生成“版本3的UUID / UUID3”或者“版本5的UUID / UUID5”来解决你的问题。
版本3的UUID是通过使用DNS命名空间来创建的。
>> import uuid
>> uuid.NAMESPACE_DNS
>> UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
>> uuid.uuid3(uuid.NAMESPACE_DNS, 'YOU EMAIL ID')
>> UUID('3d813cbb-47fb-32ba-91df-831e1593ac29')
版本5的UUID也可以用类似的方法生成。
你还可以使用“NAMESPACE_URL”来生成UUID3或UUID5。
(uuid.NAMESPACE_URL)
虽然我不太清楚命名空间到底是个什么东西,但我会试试这个:
>> import uuid
>> mail = "foo@bar.example"
>> uuid.uuid5(uuid.NAMESPACE_URL, mail)
UUID('45348e31-1ca5-57f3-ad95-cb80bf6ad145')
如果你只需要一个独特的哈希值,你也可以使用 hashlib
这个模块。
>> import hashlib
>> m = hashlib.sha1()
>> m.update(mail)
>> m.hexdigest()
'edb13b9a276142c6dcb93534a21f497fec4b93f8'