答案 0 :(得分:3)
如果不确切知道命名空间是什么,我会试试这个:
>> 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'
答案 1 :(得分:2)
您需要生成“版本3 UUID / UUID3”或“版本5 UUID / UUID5”来解决您的问题。
使用DNS名称空间创建版本3 UUID。
>> 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')
UUID5可以类似地生成..
您还可以使用“NAMESPACE_URL”生成UUID3或UUID5。
答案 2 :(得分:0)
正如其他人告诉你的那样,你必须使用uuid3或uuid5。 (哪一个,如果你不关心密码学就没关系。我会在这个例子中使用uuid3。)现在你必须决定命名空间。
DNS没有意义,因为它只接受FQDN,哪个电子邮件地址肯定不是。理论上,如果你在LDAP中,可以使用X.500,但它仍然比必要的更复杂。据我所知,OID树没有电子邮件的弧线 - 这是正确的,因为他们正在尝试构建永久注册表,而电子邮件地址并不是永久性的。
因此,留下了URI。电子邮件地址是URI吗?幸运的是,是的。 [形式上,它只适用于URL,但幸运的是,电子邮件地址也是URL。] URI具有this Wikipedia article中描述的语法。因此,您必须找到一个方案,然后将数据放入其中。 IANA为您提供a list of schemes,您可以在其中找到“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)