Прежде чем вы начнете отмечать это как дубликат, прочитайте меня. Другой вопрос имеет (скорее всего) неверный принятый ответ.
Я не знаю, как .NET генерирует свои GUID, возможно, только Microsoft, но есть высокая вероятность, что он просто вызывает CoCreateGuid(), Однако эта функция документирована как вызов UuidCreate(). И алгоритмы для создания UUID довольно хорошо документированы.
Короче говоря, как бы то ни было, кажется, что System.Guid.NewGuid()
действительно использует версию 4 алгоритм генерации UUID, потому что все GUID он генерирует соответствие критериям (см. сами, я попробовал пару миллионов GUID, все они совпали).
Другими словами, эти GUID являются почти случайными, за исключением нескольких известных бит.
Это снова вызывает вопрос - как случайный IS этот случайный? Как знает каждый хороший маленький программист, алгоритм псевдослучайного числа является столь же случайным, как и его семя (он же энтропия). Итак, каково семя для UuidCreate()
? Как переназначается PRNG? Является ли это криптографически сильным, или я могу ожидать, что те же самые GUID начнут выливаться, если два компьютера случайно вызовут System.Guid.NewGuid()
в одно и то же время? И можно ли предположить состояние PRNG, если собрано достаточно много последовательно сформированных GUID?
Добавлено: Чтобы уточнить, я хотел бы узнать, насколько случайным я могу доверять ему и тем самым - где я могу его использовать. Итак, позвольте установить грубую шкалу "случайности":
- Базовая случайность, принимая текущее время в качестве семени. Используется для перетасовки карт в Solitaire, но еще немного, поскольку столкновения слишком легко прийти даже без попытки.
- Более продвинутая случайность, использующая не только время, но и другие специфические для машины факторы для семян. Возможно, также высевается только один раз при запуске системы. Это можно использовать для генерации идентификаторов в БД, поскольку дубликаты маловероятны. Тем не менее, это не хорошо для безопасности, потому что результаты можно предсказать с достаточными усилиями.
- Cryptograhpically random, используя шум устройства или другие продвинутые источники случайности для семян. Повторно посеяны при каждом вызове или, по крайней мере, довольно часто. Может использоваться для идентификаторов сеансов, переданных неназванным сторонам и т.д.
Я пришел к этому вопросу, думая, что было бы хорошо использовать их в качестве идентификаторов БД, и была ли реализована реализация алгоритма Guid.comb вместе с System.Guid.NewGuid()
(например, NHibernate) будет ошибочным или нет.