UUID python на основе электронной почты - PullRequest
3 голосов
/ 24 ноября 2011

Как генерировать UUID на основе идентификаторов электронной почты?

У меня есть чтение документов.

Я предпочитаю использовать модуль UUID.

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

Не зная точно, что представляет собой пространство имен, я бы попробовал это:

>> 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'
2 голосов
/ 24 ноября 2011

Вам необходимо сгенерировать «UUID / UUID3 версии 3» ИЛИ «UUID / UUID5 версии 5», чтобы решить вашу проблему.

UUID версии 3 создается с использованием пространства имен 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')

UUID5 может быть сгенерирован аналогично ..

И вы также можете использовать «NAMESPACE_URL» для генерации UUID3 или UUID5.

(uuid.NAMESPACE_URL)

0 голосов
/ 18 июля 2015

Как уже говорили другие, вы должны использовать uuid3 или uuid5. (Какой, на самом деле, не имеет значения, если вы не заботитесь о криптографии. Я буду использовать uuid3 в этом примере.) Теперь вам нужно определиться с пространством имен.

DNS не имеет смысла, поскольку он принимает только полные доменные имена, которые, безусловно, не являются адресом электронной почты. X.500 теоретически можно использовать, если вы находитесь в LDAP, но это все же более сложно, чем необходимо. Насколько мне известно, у дерева OID нет дуги для электронной почты - и это правильно, поскольку они пытаются создать постоянный реестр, а адрес электронной почты на самом деле не является постоянным.

Итак, это оставляет URI. Являются ли адреса электронной почты URI? К счастью, да. [Формально это только для URL-адресов, но, к счастью, адреса электронной почты тоже являются URL-адресами.] Синтаксис URI описан в этой статье Википедии . Таким образом, вы должны найти схему, а затем вписать в нее свои данные. IANA предоставляет вам список схем , где вы можете найти «mailto» как «Адрес электронной почты», «Постоянную» схему. Похоже, именно то, что мы хотим.

Вы также получаете ссылку на RFC, в данном случае RFC 6068 , которая говорит вам, как именно вы должны отформатировать адрес электронной почты. Возможная проблема заключается в том, что вы говорите о «идентификаторе электронной почты», который может означать только «локальную часть» («имя пользователя», как его обычно называют). Конечно, это не сработает, поскольку не является уникальным во всем мире.

[Единственный способ заставить его работать, это как-то ограничить пространство имен для вашего почтового сервера. Вы можете делать это с 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)
...