Здравствуйте, exp_1, Вы писали:
_>Здравствуйте, Disappear, Вы писали:
D>>Не подскажете ли алгоритм, который бы генерировал уникальные (в ближайшие лет 100) числа? Например, как это делает CoCreateGUID. Только хочется, что-нибудь отличное от GUID.
_>Если скорость не важна, то самое простое – это взять что либо физически случайное из компьютера.
_>Например показания датчиков (температур, скорости вентиляторов, напряжений), шум звуковой платы, асинхронность генераторов в СМОS и MB.
_>Я считаю, что очень хороший результат даёт RDTSC in CPU PENTIUM.
_>Точнее, хорим некоторое время, большее чем время между прерываниями, последовательные результаты RDTSC, затем хорим все биты результата и получаем случайный бит.
_>За счёт асинхронности современных компьютеров получается очень хороший результат.
_>Тесты это подтверждают.
_>Далее, берём таких битов столько, сколько надо, и получаем уверенно уникальный GUID. На 100 лет хватит 64 бит.
_>Пример с исходником (Генератор паролей) здесь:
_>http://www.isan.troitsk.ru/~panfilov/Rus/Programs.htm
Хм. Интересный способ. А на AMD процессорах работат?
Жаль что линка дохлая, очень интересно было бы взглянуть.
Здравствуйте, Disappear, Вы писали:
D>Хм. Интересный способ. А на AMD процессорах работат?
D>Жаль что линка дохлая, очень интересно было бы взглянуть.
На АМД работает от К6 и выше. На К5 и ниже, типа AMD486 уже нет.
Странно, что линка не работает. Тогда попробуйте
эту.
Вспомнились ещё способы получения шумов на PC:
Асинхронность вращения FD, CD, HD.
Использовался даже такой экзотический, как отключение автоматической регенерации RAM и шумоподобная порча данных в ней.
Если нужна скорость, то начальная часть GUID берётся уникальной, а остальная инкрементированием.
MS GUID содержит 128 бит.
Здравствуйте, Andrew_B, Вы писали:
A_B>делали как-то репликацию двух баз mssql,там uniqueidentifier-ы совпали
попробуйте использовать sequence number, как в Oracle. В этом случае ключи всегда уникальны.
Здравствуйте, pavel_turbin, Вы писали:
_>Здравствуйте, Andrew_B, Вы писали:
A_B>>делали как-то репликацию двух баз mssql,там uniqueidentifier-ы совпали
_>попробуйте использовать sequence number, как в Oracle. В этом случае ключи всегда уникальны.
Sequence-ы здесь мало помогут. Если не ошибаюсь, в MSSQL guid-ы используются для генерации идентификаторов, уникальных между серверами. Распределенные сиквенсы в Oracle мне неизвестны. Там обычно эта задача решается соединением идентификатора, уникального локально, с неким раздаваемым централизованно идентификатором сервера БД.
[ Posted via RSDN@Home 1.1.4 beta 5 (395) listening to silent ]
Здравствуйте, Andir, Вы писали:
A>Если не сильно важна скорость, то можно сделать очень простую вещь.
A>Берём время, создаём из неё строку и хешируем её (SHA1, SHA256, SHA512 — выбирай нужную длину). Полученный результат используем.
Хотя конечно глобальной уникальности так не получить
С Уважением, Andir!