2009-04-13 3 views
3

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

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

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

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

Любые другие идеи?

Благодаря

EDIT: Ну я пытаюсь практиковать Domain Driven Design и все мои объекты должны иметь удостоверение личности при создании действительной. Я мог бы в теории позвонить в БД, чтобы получить число с добавленным авто, но скорее избегнет этого, поскольку данные, связанные с БД, попадают в Домен.

+0

Непонятно, зачем вам это глобально уникально, но если вы этого не сделаете, я боюсь, что 32 бита не хватит. – Gleb

ответ

4

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

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

+0

«это ограниченная ставка - вы не можете выдать более 1 идентификатора за галочку» - на самом деле. Это зависит от точности системных часов. – Joe

+0

Я бы пошел последовательным маршрутом. –

+0

@Joe - Если вы имеете в виду, что скорость может быть ниже (часы пропускают «тики»). Но оно не может быть выше, поэтому оно ограничено скоростью тика. – MarkusQ

1

ли они считаются глобально уникальный?

1) (целое) DateTime.Now.Ticks 2) (интермедиат) DateTime.Now * RandomNumber

Ни одна из опций является глобально уникальным.

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

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

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

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

Смежные вопросы