Как создать дружественный человеку уникальный идентификатор в Python?

Как создать уникальное значение идентификатора, которое можно легко передать по телефону или электронной почте, которое можно легко запомнить, пока все еще не легко угадать.

Я использую базу данных. Но поскольку я передаю идентификатор людям, я не хочу, чтобы он привязывался к базе данных. Я мог бы сделать что-то с уникальным идентификатором, который у меня уже есть в базе данных, но не могу использовать его напрямую, чтобы избежать его угадывания.

Я использую Python и пытаюсь использовать uuid, но uuid слишком длинный, чтобы быть человеком, читаемым.

Есть ли способ создать дружественный человеку идентификатор?

Ответ 1

Что вы хотите сделать, это сшить слоговые слова для создания произносимых псевдослов. Вы можете создавать слоги на любом языке, который вам нравится составлять слова, которые могут быть произнесены и переданы, но на самом деле ничего не значит.

Вот статья о том, как один человек создал человекообразные идентификаторы UID для их фонетической речи и некоторых подводных камней.

Прочитайте приведенную выше ссылку только для некоторых подводных камней, которые вы должны учитывать при принятии такого подхода.

Вы могли бы просто использовать строку буквенных букв, но представить их как фонетический алфавит НАТО, а не только алфавит.

Ответ 2

Для писем я использую:

from base64 import b64encode
from os import urandom
key = b64encode(urandom(9))

Вы можете увеличить/уменьшить длину, изменив номер. Иногда вы получаете символы + и /, и вы можете их вырезать, если хотите.

Edit: Поскольку вы также хотите передать их по телефону, возможно, b32encode(urandom(5)) будет лучшим выбором, поскольку он не даст вам никаких строчных или необычных символов.

Ответ 3

Как насчет чего-то вроде платных фраз Амазонки? Преобразуйте двоичный код в последовательность английских слов.

Если вы хотите что-то с тем же диапазоном, что и UUID, вам нужно представить 16 байт. Чтобы это было разумно, ограничьте фразу на 4 слова, поэтому каждое слово представляет 4 байта или 65536 возможностей, поэтому вам понадобится словарь из 262 144 слов.

EDIT: Фактически на размышлениях, что может быть лучше, это своего рода безумное предложение lib - оно ограничит количество необходимых слов и может облегчить запоминание, поскольку оно имеет грамматическую структуру. Это, конечно, должно быть длиннее, возможно, что-то вроде этого:

(a/an/the/#) (adj) (существительное) (глагол) (время) (наречие) while (a/an/the/#) (adj) (существительное) (глагол) (наречие).

Ответ 4

Вот пример на основе uuid. Отрегулируйте 1000000 для увеличения или уменьшения диапазона ваших идентификаторов. Поскольку вы уменьшаете диапазон идентификатора, вам, вероятно, придется проверить, существует ли идентификатор.

>>> import uuid
>>> hash(str(uuid.uuid1())) % 1000000
380539
>>> hash(str(uuid.uuid1())) % 1000000
411563

Ответ 5

Конечно, но для вашего проблемного пространства требуется еще несколько ограничений, а именно:

  • Есть только одна генерация уникальных идентификаторов
  • В ваших товарах есть понятие названия.
  • Вы можете сохранить список строк

Затем вы сделаете что-то вроде:

_UID_INTERNALS = set()

def getID(obj):
    if hasattr(obj, 'UID'):
        return obj.UID
    title = obj.title.encode("ascii", errors="ignore")
    title = title.lower()
    title = "-".join(title.split())
    if not title:
        title = "unnamed-object"
    UID = title
    num = 1
    while UID in _UID_INTERNALS:
        UID = title + str(num)
        num += 1
    _UID_INTERNALS.add(UID)
    obj.UID = UID
    return UID