Вопрос: Когда у вас есть .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 или как можно ближе.