Я использую следующий код C # для вычисления хэша MD5 из строки. Он работает хорошо и генерирует шестнадцатеричную строку из 32 символов, например:
900150983cd24fb0d6963f7d28e17f72
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
sSourceData = "MySourceData";
//Create a byte array from source data.
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
// and then convert tmpHash to string...
Есть ли способ использовать такой код для создания шестнадцатеричной строки из 16 символов (или строки из 12 символов)? Шестнадцатеричная строка из 32 символов - это хорошо, но я думаю, что покупателю будет скучно вводить код!
Ответы:
Согласно MSDN
Создать MD5:
источник
источник
BitConverter
он не работает одинаково в Windows и Linux, см. этот вопрос: stackoverflow.com/questions/11454004/…Пытался создать строковое представление хэша MD5 с помощью LINQ, однако ни один из ответов не был решениями LINQ, поэтому добавлял это в шведский стол доступных решений.
источник
return string.Join( "", hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
return string.Concat( hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
вместо этого. Это немного короче, возможно, более четкое намерение и работает немного быстрее (увеличение производительности <10%).Полностью зависит от того, чего вы пытаетесь достичь. Технически вы могли бы просто взять первые 12 символов из результата хеширования MD5, но спецификация MD5 состоит в том, чтобы сгенерировать 32 символа.
Уменьшение размера хэша снижает безопасность и увеличивает вероятность коллизий и поломки системы.
Возможно, если вы сообщите нам больше о том, чего вы пытаетесь достичь, мы сможем больше вам помочь.
источник
Вы можете использовать
Convert.ToBase64String
для преобразования 16-байтового вывода MD5 в строку из 24 символов. Немного лучше без снижения безопасности. (j9JIbSY8HuT89/pwdC8jlw==
для вашего примера)источник
Поддержка строки и файлового потока.
Примеры
-
источник
Полагаю, в строке MD5 лучше использовать кодировку UTF-8.
источник
Хеш MD5 составляет 128 бит, поэтому вы не можете представить его в шестнадцатеричном формате с менее чем 32 символами ...
источник
источник
Более быстрая альтернатива существующему ответу для .NET Core 2.1 и выше:
Вы можете оптимизировать его еще больше, если уверены, что ваши строки достаточно малы, и замените encoding.GetBytes на unsafe int GetBytes (ReadOnlySpan chars, Span bytes) альтернативой.
источник
Это решение требует C # 8 и использует преимущества
Span<T>
. Обратите внимание, что при необходимости вам все равно потребуется позвонить.Replace("-", string.Empty).ToLowerInvariant()
для форматирования результата.источник
источник
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5?view=netframework-4.7.2
источник
Я хотел бы предложить альтернативу, которая работает как минимум на 10% быстрее, чем ответ craigdfrench в моих тестах (.NET 4.7.2):
Если вы предпочитаете располагать
using System.Runtime.Remoting.Metadata.W3cXsd2001;
вверху, тело метода можно сделать более удобным для чтения однострочным:Достаточно очевидно, но для полноты в контексте OP это будет использоваться как:
источник
Идентифицируйте что-нибудь о 16-символьных шестнадцатеричных строках ....
Но вот мой для создания хеша MD5 в одну строку.
источник