Я пытаюсь создать уникальные идентификаторы для использования в приложении Google App Engine и хотел бы получить обратную связь о возможности подхода, который я собираюсь использовать (вопросы в конце). Я прочитал довольно много вопросов по этой теме, но я не помню, чтобы натолкнуться на этот конкретный подход.крошечное случайное генерирование ID
Я бы хотел, чтобы случайно выглядели идентификаторы, например хеши MD5, но я также хочу, чтобы они были маленькими. Четыре-шесть символов, по тиньюрлю, были бы идеальными. Идентификаторы будут предназначены для контента, созданного пользователями, в контексте моего приложения, например, для вопросов, которые будут писать люди. Нет необходимости, чтобы идентификаторы были случайными (это нормально, если они похожи на серийные идентификаторы), но подход, который я собираюсь использовать, подходит для этого, поэтому это не проблема.
Люди, знакомые с Google App Engine, будут знать, что записи в хранилище данных особенно дороги и могут привести к таймаутам, если их слишком много для одной и той же группы сущностей. Оверенные счетчики - это подход, который часто используется, чтобы избежать конкуренции на одном глобальном счетчике и неудачных транзакциях, которые идут с ним.
Наряду с получением коротких идентификаторов и избеганием конкуренции в записи, я стараюсь избегать парадоксального дня рождения. Я хотел бы подготовиться к возможности наличия миллионов идентификаторов, даже если это немного заходит за борт.
Я думал об использовании sharded счетчика по следующим направлениям:
- Счетчик sharded на пользователей, так что есть осколок для каждого пользователя. Каждый объект счетчика имеет свой собственный счет, который специфичен для данного пользователя, который увеличивается, когда новый элемент создается этим пользователем. Счет увеличивается, независимо от того, успешно ли создан элемент.
- Основой идентификатора является хеш MD5 следующей строки: «< user-email-address > | < последнее значение >».
- Получившийся хеш MD5 затем усекается, изначально до четырех символов.
- Сохраняется одно глобальное значение длины. Всякий раз, когда предыдущие шаги приводят к дублированному ключу (один из них предполагает, что это произойдет довольно быстро вначале), значение длины будет увеличено на единицу. Хеши MD5 для новых идентификаторов теперь будут усечены с символами «длина», а не с четырьмя символами.
- Я не хочу раскрывать адрес электронной почты пользователя, что предполагает, что какой-то хэш-код будет хорошим способом.
Мои вопросы: Правильно ли я думаю, что это в значительной степени избежит конкуренции с напитками в результате дублирования ключей, и что заявление о конкуренции на поле длины, вероятно, не будет проблемой, особенно на более длинных длинах? Может ли кто-нибудь описать здесь математику? Будет ли длина быстро увеличиваться примерно до длины хеша MD5, ставя под сомнение ценность всего подхода? Было бы лучше просто пойти с полным (более длинным) MD5-хешем, чтобы все было проще в обслуживании? Есть ли что-то, что я пропускаю?
Спасибо за интересный подход. Я подумаю и постараюсь лучше понять это. Один из вопросов, который у меня есть, заключается в том, насколько это может привести к столкновениям (или повторениям) по мере увеличения количества ключей. Я пытаюсь держать столкновений как можно ближе к нулю. –
Вы столкнулись с конфликтами при заполнении разделов. – Dave
Существуют и другие оптимизации, которые вы можете сделать с этим: 1. Memcache список «заполненных разделов» 2. Если вы собираетесь получить кучу идентификаторов сразу, то вы можете захватить блок из n идентификаторов из и затем увеличивайте счетчик на это значение. – Dave