MessagePack Дайте различные сериализации в разных версиях .NET [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 MessagePack Дайте различные сериализации в разных версиях .NET [закрыто]

Сообщение Anonymous »

Обновление: < /p>
После нового и более внимательного взгляда на эту проблему я обнаружил, что источником различных результатов SHA1 являются не сам расчет SHA1, а MessagePack, который используется в качестве замены устаревшего бинарноформированного для сериализации объектов, которые должны быть рассчитаны SHA1. (Вывод сериализации - а затем используется массив байтов сериализация по дизайну. В любом случае: моя проблема решается. Библиотека Sha1calculatior на .net 6.0, а с MessagePack Ver 3.1.3 (Nuget) имеет следующий код: < /p>
using System.Security.Cryptography;
using MessagePack;

namespace Sha1Calculator {

public class HashCalculator {

private static SHA1 sha1 = SHA1.Create();

public static byte[] ToByteArray(params object?[] args) {
if (args == null) throw new Exception("ToByteArray: Args is null");
try {
return MessagePackSerializer.Typeless.Serialize(args);
} catch (Exception e) {
throw new Exception($"ToByteArray: {e.Message}");
}
}

private static string getSha1FromBytes(byte[] data) => Convert.ToHexString(sha1.ComputeHash(data));

public static string GetSha1(object?[] args) => getSha1FromBytes(ToByteArray(args));

}

}

< /code>
Затем консольные приложения в различных версиях .NET с тестами. Вот код для версии .net6 (код для других версий равен, за исключением заголовка, записанного в консоли.): < /P>
using Sha1Calculator;

namespace TestSha1
{
internal class Program
{
internal static void Test(string strArgs, params object[] args) {
var bytes = HashCalculator.ToByteArray(args);
Console.WriteLine();
Console.WriteLine($"Test({strArgs})");
Console.WriteLine($"Bytes({bytes.Length}): {string.Join(", ", bytes)}");
Console.WriteLine($"Sha1: {HashCalculator.GetSha1(args)}");
}

static void Main(string[] args)
{
Console.WriteLine("TestSha1_NET6...");
Test("\"Hello World!\"", "Hello World!");
Console.WriteLine();
Console.Write("Press any key to quit..."); Console.ReadKey();
}
}
}
< /code>
Вывод из различных версий - следующее < /p>
.net6:

testsha1_net6. ..

test ("Привет, мир!")
Bytes (125): 199, 122, 100, 217, 106, 83, 121, 115, 116, 101, 109, 46 , 79, 98, 106, 101, 99, 116, 91, 93, 44, 32, 83, 121, 115, 116, 101, 109, 46, 80, 114, 105, 118, 97, 116, 101, 46 , 67, 111, 114, 101, 76, 105, 98, 44, 32, 86, 101, 114, 115, 105, 111, 110, 61, 54, 46, 48, 46, 48, 46, 48, 44 , 32, 67, 117, 108, 116, 117, 114, 101, 61, 110, 101, 117, 116, 114, 97, 108, 44, 32, 80, 117, 98, 108, 105, 99, 75 , 101, 121, 84, 111, 107, 101, 110, 61, 55, 99, 101, 99, 56, 53, 100, 55, 98, 101, 97, 55, 55, 57, 56, 101, 145 , 172, 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33
sha1: 970b060efb191c1c75faad08aaf25b4343895db3

umy quie to quit ... br /> < /pre>
.net8:

testsha1_net8...

test ("Hello World! ")
Bytes (125): 199, 122, 100, 217, 106, 83, 121, 115, 116, 101, 109, 46, 79, 98, 106, 101, 99, 116, 91, 93 , 44, 32, 83, 121, 115, 116, 101, 109, 46, 80, 114, 105, 118, 97, 116, 101, 46, 67, 111, 114, 101, 76, 105, 98, 44 , 32, 86, 101, 114, 115, 105, 111, 110, 61, 56, 46, 48, 46, 48, 46, 48, 44, 32, 67, 117, 108, 116, 117, 114, 101 , 61, 110, 101, 117, 116, 114, 97, 108, 44, 32, 80, 117, 98, 108, 105, 99, 75, 101, 121, 84, 111, 107, 101, 110, 61 , 55, 99, 101, 99, 56, 53, 100, 55, 98, 101, 97, 55, 55, 57, 56, 101, 145, 172, 72, 101, 108, 108, 111, 32, 87 , 111, 114, 108, 100, 33
sha1: bd2fa1e0fd1d98dcc582170520ff3acaa3ac7523

нажмите любую клавишу, чтобы бросить ...
< /pre>
I First. Мысль, последовательности байтов были равны в двух случаях и пришли к выводу (ложно), что расчеты SHA1 по себе были разными. Но последовательности байтов, как вы можете видеть, не равны! Неверное утверждение о том, что SHA1 дает различный результат в разных версиях .NET) < /p>
Я использую SHA1 в библиотеке, написанной в C# net6.0, чтобы обнаружить изменения и сравнить тексты, массивы и другие типы объектов, Подобно использованию SHA1 в GIT. Это требование (например, в GIT), мы можем проверить изменения и сравнить различные объекты через долгое время (возможно,). Следовательно, мы должны быть в состоянии поверить, что расчеты SHA1 являются стабильными, даже если были созданы новые версии нашего приложения, вероятно, с более новыми версиями .net. < /P>
Вот моя проблема: Я ожидал, так как SHA1 существует некоторое время, что вычисленные значения хеш будут такими же, как сейчас, когда я обновил нашу библиотеку до Net8. Но удивительно, но они дают разные значения для одного и того же ввода в Net8 по сравнению с Net6, и даже другие значения в Net9! при обновлении других частей приложения до новых сетевых версий. Но это не работает: если я использую библиотечную сборку на Net6 с помощью, например, консольного приложения на Net8, значения хэша SHA1 рассчитываются с помощью Net8-версии SHA1. Очевидно, невозможно обновить приложение на более новые версии .net, не нарушая требования относительно стабильности в расчетах SHA1. < /P>
Мой вопрос: есть ли решение этой проблемы, предпочтительно способ Чтобы заставить SHA1-Calculations, доставленные библиотекой для использования версии библиотеки .NET, а не версии клиентов .NET ?NET? >
using System.Security.Cryptography;

public static class Library {

private static SHA1 sha1;

public static byte[] GetSha1(byte[] data) {
return sha1.ComputeHash(data);
}

static Library() {
sha1 = SHA1.Create();
}

// More code ...
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... ons-of-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»