Создание Guid с использованием ha sh строки - PullRequest
0 голосов
/ 19 июня 2020

Я играю с идеей использования Guid в качестве PrimaryKey в базе данных без SQL, которая представляет собой комбинацию трех различных свойств (вероятно, это плохая идея). Эти три свойства: два целых числа и DateTime - они уникальны в сочетании. Причина, по которой я использую Guid, заключается в том, что уже существующие данные той же структуры используют Guid вместо этих свойств для поиска данных.

Если я конвертирую их в строки и объединяю их. Затем я конвертирую в byte [] и создаю Guid. Каковы шансы столкновения? Полагаю, проблема здесь в хешировании? Если я использую слабый 16-байтовый алгоритм хеширования, такой как MD5, какова вероятность совпадения двух руководств (коллизия), если свойства различны; например, целые числа и дата и время? Что произойдет, если я использую алгоритм хеширования, такой как SHA256, и просто использовал первые 16 байтов вместо MD5? Остались ли шансы на коллизию такими же? *

1 Ответ

3 голосов
/ 19 июня 2020

Зачем вообще хеширование? Если вы полностью уверены, что эти три параметра вместе всегда уникальны, тогда у вас есть все данные, необходимые для создания уникального GUID. DateTime имеет длину 8 байтов, int - 4 байта, поэтому ваши данные имеют длину 16 байтов, и это точный размер GUID. Вы можете использовать BitConverter, чтобы получить байты этих значений и использовать конструктор GUID, который принимает 16-байтовый массив:

DateTime firstValue = DateTime.Now; //Or whatever it is
int secondValue = 33; //whatever
int thirdValue = 44;  //whatever

List<byte> tempBuffer = new List<byte>();

tempBuffer.AddRange(BitConverter.GetBytes(firstValue.ToBinary())); //Needs to convert to long first with ToBinary
tempBuffer.AddRange(BitConverter.GetBytes(secondValue));
tempBuffer.AddRange(BitConverter.GetBytes(thirdValue));

Guid id = new Guid(tempBuffer.ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...