Хеширование нескольких байтов [] вместе в один хэш с С#?

У меня есть три поля: string Title, byte[] Body и byte[] Data, из которых я хочу рассчитать один хэш в качестве проверки, чтобы убедиться, что они не были повреждены или повреждены.

В Python я могу использовать md5.update() несколько раз подряд, чтобы выполнить это. Но я не могу найти такую ​​же возможность в С#. Чтобы использовать MD5.ComputeHash(), мне нужно будет скопировать все мои источники в один байт [], что является шагом, который я бы хотел избежать.

Как я могу объединить все это в один хэш без необходимости копировать данные во временный буфер?

Ответ 1

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

Создать экземпляр, например. MD5CryptoServiceProvider и вызовите TransformBlock Method для каждого блока и TransformFinalBlock Method для последнего блока:

MD5 md5 = new MD5CryptoServiceProvider();

// For each block:
md5.TransformBlock(block, 0, block.Length, block, 0);

// For last block:
md5.TransformFinalBlock(block, 0, block.Length);

// Get the hash code
byte[] hash = md5.Hash;

Ответ 2

Используя простой .NET, я не думаю, что есть способ обновления и хеш MD5. Однако в Windows есть функция MD5Update, определенная в crypt.dll. Вы можете использовать Interop, чтобы использовать это, я полагаю.

В противном случае существует реализация эквивалента PHP в .NET С#, расположенном здесь на SO: Проблема переноса функции PHP crypt() на С#

PS: я бы определенно пошел на комбинированное решение переменной темпа: -)

Ответ 3

вы можете создать Hash над значениями Hash.

MD5 md5 =  System.Security.Cryptography.MD5.Create();
byte[] totalHash= md5.ComputeHash(md5.ComputeHash(part1).Concat(md5t.computeHash(part2)));

не создает копию массива байтов, а хеширует конкатенацию хешей.

Ответ 4

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

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

Вы не говорите, почему вы хотите избежать такого подхода. Я думаю, что он выигрывает с точки зрения простоты и ремонтопригодности. Это самодокументированный, очевидный подход. Это самый эффективный метод. Я действительно не вижу нисходящего.

Ответ 5

Вы должны объединить их все в одну переменную, а затем вычислить хеш-память MD5. Я не вижу там ярлыка.

Понимаете, большинство предлагаемых здесь решений просто попробуйте либо запустить несколько команд в одной строке ( "один лайнер" ), либо реализовать что-то "под капотом", объединив свои поля, а затем Hash...