Является ли временная метка хорошей основой для создания уникальных идентификаторов при разработке системы хеширования / индексирования? - PullRequest
0 голосов
/ 17 апреля 2011

В настоящее время я работаю над несколькими проектами, которые включают записи пользователей в базе данных, которые должны быть однозначно идентифицированы. (Некоторые примеры менеджер пользовательских скриптов и список моих приложений .)

Является ли использование временной метки хорошим способом или отправной точкой для управления этими записями и обеспечения их уникальности?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2011

Короче говоря, нет.

Метки времени не являются уникальными по своей природе из-за различных причин, в том числе:

  • Многопоточность (включая потоки на нескольких хостах);и
  • Детализация отметки времени - то есть сами часы - запускают пару тестовых программ, одна из которых отправляет сообщения, а другая - «обрабатывает» их с помощью временной отметки, и вы увидите, что вы получаете много записейс одной и той же отметкой времени, потому что на многих платформах системные часы не меняются миллисекундами каждую миллисекунду.Хуже того, вы не можете зависеть от этого поведения: оно зависит от платформы и скорости.

Так что, как отмечается в комментариях к Колинмарку, используйте uuid, если вам нужен уникальный идентификатор.

0 голосов
/ 19 апреля 2011

Для этого нет двух причин:

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

Кроме того, MySQL уже включает гарантированный способ назначения уникальных идентификаторов (целые числа с автоматическим приращением), и UUID считаются лучшим способом сделать это кроссплатформенным.Я бы пошел с большинством в этом ...

0 голосов
/ 17 апреля 2011

Я бы, вероятно, конкатенировал метку времени и что-то еще, например, user_id или текст записи, и добавил бы несколько случайных символов, если можно, затем хэшировал бы все это.

Что-то вроде SELECT MD5(CONCAT(entry_time, NOW())), вероятно, сработает, и это красиво и просто.

...