Генерация ключей в Google App Engine - PullRequest
3 голосов
/ 28 мая 2011

Если вы когда-нибудь использовали Google App Engine.Он генерирует ключ для каждого экземпляра созданной модели.Это довольно опрятно.

Я собираюсь построить что-то подобное.Они делают это так, чтобы ключ основывался на содержании?Или они просто берут случайный выбор из a-zA-Z0-9 примерно 50 раз и строят из него строку?Это звучит разумно, потому что вероятность того, что 2 клавиши будут одинаковыми, будет меньше, чем 1/10 ^ 89.

Ответы [ 4 ]

3 голосов
/ 28 мая 2011

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

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

1 голос
/ 29 мая 2011

Ключи в App Engine основаны на:

  1. Ключах сущностей-предков сущности, если таковые имеются.

  2. Видимя объекта.

  3. Либо автоматически сгенерированный целочисленный идентификатор, либо назначенное пользователем имя ключа.Целочисленные идентификаторы выделяются в обычно увеличивающихся блоках различным экземплярам приложения, так что они могут быть гарантированно уникальными, но не гарантированно фактически назначаются сущностям монотонно возрастающим образом.*

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

1 голос
/ 28 мая 2011

Более подробную информацию о том, как создается универсальный уникальный идентификатор *, можно найти здесь .

Если вы хотите создать его со стороны php кода, вы можете использовать функцию uniqid. Больше информации здесь .

0 голосов
/ 28 мая 2011

Может быть не на 100% уникальным, но я использую что-то вроде этого:

def get_unique_id_str():
    import binascii
    import uuid
    table = ''.join(chr(i) for i in xrange(256))
    return binascii.b2a_base64(uuid.uuid4().bytes).translate(table, '/+=\n')

key_name = get_unique_id_str()
instance = MyModel(key_name=key_name, ...)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...