Достаточно ли хороша эта логика для генерации уникальных чисел
Уникальный в каком объеме? На нескольких компьютерах / процессов / AppDomain
s?, Конечно, нет. В пределах одного AppDomain
? На самом деле, нет. Генерация 2 миллионов чисел не имеет значения - это просто проверка того, что ваша часть последовательности работает. (2 21 составляет чуть более 2 миллионов.)
Если вы можете позвонить GetUniqueNumber
2 21 + 1 раз в пределах гранулярности DateTime.Now
(что, вероятно, будет ~ 10-15 мс), то вы получите повторение. Вы измерили, как быстро ваш компьютер может назвать это?
Тогда есть тот факт, что эти 43 бита будут повторяться за 2 43 тактов ... или, по крайней мере, было бы, если бы у вас были достаточно мелкозернистые часы. (И рано или поздно гранулярность сработает против вас.)
Я обнаружил, что некоторые сгенерированные числа являются "-ve", которые я не понял.
Всякий раз, когда для dateTimeNo
установлен верхний бит (из 43), вы получите long
с установленным верхним битом, что означает, что он будет отрицательным.
РЕДАКТИРОВАТЬ: Также обратите внимание, что ваш сдвиг нарушен. Это:
const long dateTimeMask = ~(0L) >> timeShift;
выполняется сдвиг с расширенным знаком - так что вы просто получаете ~ 0L.
Вкратце: используйте Guid.NewGuid
. Вот для чего это.