Обновление: < /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
MessagePack Дайте различные сериализации в разных версиях .NET [закрыто] ⇐ C#
Место общения программистов C#
1739401567
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 ...
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79432472/messagepack-give-different-serializations-in-different-versions-of-net[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия