У меня есть структура, имеющая 3 целых числа в [1, 1000] и строку.
Мне нужно представить его в виде 32-битного числа, чтобы две структуры, отличающиеся хотя бы одним полем, давали разные коды, а структуры с одинаковым содержимым постоянно давали один и тот же код. Обычно одно из целочисленных полей увеличивается на несколько единиц. Это обязательно должно привести к другому коду.
Сначала я думал отформатировать поля структуры в строку в константном формате, а затем хэшировать ее с помощью функции GetHashCode класса String. Но затем я прочитал здесь в некоторых обсуждениях, что повторяющиеся процессы, выполняемые на одном и том же входе, не обязательно производят один и тот же хеш-выход. Прежде всего, верно ли это для .NET 4? Для меня это важно, потому что хэш-значения должны сохраняться и оставаться согласованными во время выполнения процесса. Я также видел здесь предложения выполнять побитовые операции с результатами платформы GetHashCode, применяемыми к каждому полю структуры с использованием простых чисел. Но и здесь, видимо, я не могу рассчитывать на стабильный результат запуска процесса.
Если я использую криптографические хэш-функции, я превышаю 32 бита.
Если бы у меня не было строкового поля, я бы составил код в виде 32-битного массива из числовых полей. Может быть, стоит выполнить операцию XOR над таким битовым массивом со строковым полем GetHashCode? Увеличиваю ли я вероятность того, что повторный запуск некоторых входных данных приведет к тому же результату хеширования?
Что бы вы предложили сделать?