Локально уникальный идентификатор - PullRequest
4 голосов
/ 15 августа 2010

Вопрос: Когда у вас есть .NET GUID для вставки в базу данных, его структура выглядит следующим образом:

60 bits of timestamp, 
48 bits of computer identifier,
14 bits of uniquifier, and
 6 bits are fixed, 
----
128 bits total

Теперь у меня проблема с GUID, потому что это 128-битное число, а некоторые из используемых мной БД поддерживают только 64-битные числа.

Теперь я не хочу решать дилемму, используя значение bigint для автоинкремента, так как хочу иметь возможность выполнять автономную репликацию.

Итак, у меня появилась идея создать класс локально уникального идентификатора, который в основном представляет собой GUID, уменьшенный до 64-битного значения.

Я придумал это:

day  9 bit (12*31=372 d)
year 8 bit (2266-2010 = 256 y)
seconds  17 bit (24*60*60=86400 s)
hostname 12 bit (2^12=4096)
random 18 bit (2^18=262144)
------------------------
          64 bits total

Мой вопрос сейчас таков: временная метка в значительной степени фиксирована и составляет 34 бита, поэтому мне остается 64-34 = 30 бит для имени хоста + случайное число.

Теперь мой вопрос: 1) Вы бы предпочли увеличить битовый размер имени хоста и уменьшить случайный битовый размер, или увеличить случайный битовый размер и уменьшить битовый размер имени хоста.

2) Существует ли там алгоритм хеширования, который сводит каждую строку к n-битам? n в идеале = 12 или как можно ближе.

Ответы [ 3 ]

2 голосов
/ 15 августа 2010

Если пространство не имеет значения, то почему бы вам просто не использовать 2 столбца шириной 64 бита, а затем разделить направляющую пополам, используя 8 байт для каждого, а затем просто преобразовать их в свои 64-разрядные числа и сохранить в 2 столбцахзатем, если вам когда-либо понадобится увеличить размер до другой системы, вы все равно будете уникальны, вам просто нужно учесть объединение двух столбцов.

1 голос
/ 15 августа 2010

На самом деле, сгенерированные .NET GUID - это 6 фиксированных битов и 122 бита случайности.

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

0 голосов
/ 15 августа 2010

Зачем писать свой? Почему бы просто не генерировать равномерно случайное число? Это сделает работу хорошо. Просто возьмите первые X цифр, где X - любой нужный вам размер ... скажем, 64-битный.

См. здесь для получения информации о RAND() против NEWID() в SQL Server, который на самом деле является просто обвинительным указанием GUID против генераторов случайных чисел. Также, смотрите здесь , если вам нужно что-то более случайное, чем System.Random.

...