Похоже, ваш друг использовал Encoding.Default
вместо Encoding.Unicode
Строки в .NET имеют UTF16.Хеширование работает на байтах , но не на строках.Строка должна быть преобразована в байты.Для этого необходимо использовать определенную кодировку.
Если используется собственная кодировка .NET, то есть UTF16, исходный байтовый буфер будет иметь длину 12 байтов, а шестнадцатеричное представление хеша будет ce0bfd15059b68d67688884d7a3d3e8c
:
var valueBytes=Encoding.Unicode.GetBytes("123456");
Debug.Assert(valueBytes.Length==12);
var md5=System.Security.Cryptography.MD5.Create();
byte[] hashBytes = md5.ComputeHash(valueBytes);
var hexText=String.Join("",hashBytes.Select(c=>c.ToString("x2")));
Еслихотя используется 7-битное кодирование US-ASCII , массив будет иметь длину 6 байтов, а шестнадцатеричное представление будет e10adc3949ba59abbe56e057f20f883e
:
var valueBytes=Encoding.ASCII.GetBytes("123456");
Debug.Assert(valueBytes.Length==6);
var md5=System.Security.Cryptography.MD5.Create();
byte[] hashBytes = md5.ComputeHash(valueBytes);
var hexText=String.Join("",hashBytes.Select(c=>c.ToString("x2")));
Первые 127 байтов большинствакодовые страницы соответствуют 7-битным символам US-ASCII, поэтому большинство кодировок , включая UTF8, вернет e10adc3949ba59abbe56e057f20f883e
.Следующие кодировки будут возвращать одну и ту же хеш-строку: Encoding.GetEncoding(1251)
(кириллица), Encoding.GetEncoding(20000)
(китайская традиция) приведут к тому же хешу.
Значение Encoding.Default
возвращает кодировку, соответствующую компьютеруязык системы.Это кодировка, используемая не-Unicode-приложениями, такими как приложения C ++, скомпилированные с строковыми типами ANSI.
Encoding.GetEncoding (20273) , хотя и возвращает другое значение - это IBM EBCDIC, который использовал другоебайты даже для английского алфавита и цифр.Это вернет: 73e00d17ee63efb9ae91d274baae2459