Основной хэш строки .Net с использованием SHA256 - PullRequest
0 голосов
/ 14 декабря 2018

Здравствуйте, Сообщество SO Мне нужен опыт хеширования:

некоторый контекст

Я столкнулся с проблемой сравнения двух списков объектов.Один экземпляр списка находится в приложении .Net Core 2.0, а другой - в приложении .Net 4.5.2.

Чтобы сравнить два списка (убедитесь, что они совпадают в обоих приложениях), я хотел бы вычислить хэш списка и обменять его между приложениями.Чтобы вычислить хэш списка, я использую подход, описанный в этом ответе .

. Для этого вам нужен хеш-код объектов в списке, и вот тут моя проблемав: Кажется хорошо известным фактом (1) , что ядро ​​.Net использует поведение рандомизированного хеш-кода для строк.Чтобы вычислить хеш-код моих объектов, мне нужно было бы включить хеш-коды строк.

Подводя к моему вопросу: Является ли хорошей идеей вычислить хэш строки с использованием SHA256?

Причины, по которым я хотел бы использовать его:

  • Тот же размер вывода (256 бит можно интерпретировать как Int32)
  • SHA всегда должен выдавать один и тот же вывод (также для будущих версий .Net / core)
  • Это прощедля совместного использования между приложениями, чем для пользовательской реализации

Существуют ли более эффективные (более эффективные, простые, менее коллизионные) альтернативы?

1 Ответ

0 голосов
/ 23 декабря 2018

Вероятно, нет необходимости использовать криптографические хеш-функции из-за значительных вычислительных затрат и очень низкой выгоды от такого использования хеш-кода.Было бы достаточно некоторой базовой хеш-функции с простым сложением и умножением - см. Каков наилучший алгоритм для переопределенного System.Object.GetHashCode? для примера хорошей хеш-функции для массивов / нескольких полей (аналогично тому, который высвязал в вопросе).Требования, предъявляемые к криптографическим хеш-функциям , намного сильнее, чем обычно требуется для помещения значений в хеш-таблицы или базовые проверки неравенства.

Примечания:

  • SHA256 дает вам 8раз больше битов, чем необходимо для обычного GetHashCode (256 против 32).Чтобы получить значимое преимущество, вам нужно обновить оставшуюся часть кода для вычисления 256-битного хеш-кода.
  • SHA256 (и другие алгоритмы шифрования) работают с байтовыми массивами - вам придется преобразовывать строки в байтымассивы для вычисления хэша, что делает его еще медленнее.На этом этапе вы можете рассмотреть возможность сериализации всей структуры данных в байтовый массив и однократного вычисления SHA256.
  • , если у вас нет ограниченного набора значений, чтобы вы могли найти совершенную хеш-функцию , с которой вам всегда приходится иметь деловозможность столкновения: одинаковые хеш-коды не означают равные значения.Более длинные значения хеша уменьшат вероятность коллизии проблема дня рождения , поэтому вы можете настроить длину хеш-кода в соответствии со своими потребностями.
  • если вам нужно сделать публично известное хеширование, SHA256 - это простой способ описания ... но вы должны быть очень осторожны, чтобы объяснить, как строки преобразуются в байтовые массивы (кодирование - одна из важных частей) и если перед этим требуется какая-либо нормализация (включая String.Normalize ).

  • рассмотрим некоторые другие механизмы - возможно, версионирование данных или неизменные структуры данных для реализациивсе, что вы ищете.

...