Формулы для генерации уникального идентификатора? - PullRequest
3 голосов
/ 13 апреля 2009

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

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

Может ли это считаться уникальным?

  1. (int)DateTime.Now.Ticks
  2. (int)DateTime.Now * RandomNumber

Есть еще идеи?

Спасибо

РЕДАКТИРОВАТЬ: Ну, я пытаюсь попрактиковаться в домене, и все мои сущности должны иметь идентификатор при создании, чтобы быть действительным. Теоретически я мог бы позвонить в БД, чтобы получить автоматически увеличенное число, но я бы предпочел избежать этого, так как связанные с БД вещи попадают в домен.

Ответы [ 3 ]

4 голосов
/ 13 апреля 2009

Зависит от того, насколько уникальным он вам нужен и сколько предметов вам нужно присвоить. Ваша лучшая ставка может быть назначать их последовательно; если вы попытаетесь придумать, вы, скорее всего, столкнетесь с парадоксом дня рождения (коллизии более вероятны, чем вы ожидаете) или (как в вашем случае 1) выше) ограничены скоростью, с которой вы можете их выдавать. *

Ваш 1) выше немного лучше, чем 2) для большинства случаев; его скорость ограничена - вы не можете выдать более 1 идентификатора за тик - но не подвержены парадоксу дня рождения. Ваш 2) просто выбрасывает биты. Может быть, немного лучше XOR со случайным числом, но в любом случае я не думаю, что ранд покупает вам что-либо, просто скрывает проблему и усложняет ее решение.

1 голос
/ 13 апреля 2009

Они считаются уникальными в глобальном масштабе?

1) (int) DateTime.Now.Ticks 2) (int) DateTime.Now * RandomNumber

Ни один из этих вариантов не является глобально уникальным.

Вариант 1 - Это уникально, только если вы можете гарантировать, что на тик генерируется не более одного идентификатора. Из вашего описания это не похоже, что это будет работать.

Вариант 2. Случайные числа являются псевдослучайными, но не гарантированно являются уникальными. Имея это в виду, мы можем уменьшить часть DateTime этого параметра до проблемы, аналогичной варианту 1.

Если вы хотите глобально уникальный идентификатор, который является int32, одним хорошим способом будет синхронный сервис некоторого вида, который возвращает последовательные идентификаторы. Я думаю, это зависит от того, что означает ваше определение глобального. Если у вас было больше, чем int32, и вы имеете в виду глобальный в данной сети, то, возможно, вы могли бы использовать IP-адрес с добавленным порядковым номером, где порядковый номер генерируется синхронно между процессами.

Если у вас есть другие уникальные идентификаторы, кроме IP-адреса, тогда это, очевидно, будет лучшим выбором для отображения как часть URL-адреса.

0 голосов
/ 13 апреля 2009

Вы можете использовать класс RNGCryptoServiceProvider, если вы используете .NET

RNGCryptoServiceProvider Class

...