散列非ascii字符C#

Ale*_*lex 3 c# md5

这是两个哈希生成器:

  1. http://www.md5hashgenerator.com/index.php
  2. http://www.miraclesalad.com/webtools/md5.php

现在,我的问题是:为什么在尝试散列char'€'(0x80)时哈希值会有所不同?我认为这是因为'€'不是普通的ASCII字符.两个哈希中的哪一个是"正确的"?

我正在尝试使用C#计算哈希生成器1返回的哈希值.此散列函数不会返回它.

private string GetMD5Hash(string TextToHash)
{
        if ((TextToHash == null) || (TextToHash.Length == 0))
        {
            return string.Empty;
        }
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] textToHash = Encoding.Default.GetBytes(TextToHash);
        byte[] result = md5.ComputeHash(textToHash);
        return BitConverter.ToString(result).Replace("-", "").ToLower();
}
Run Code Online (Sandbox Code Playgroud)

我怎么能改变它所以它返回我想要的哈希?


附加信息:我制作了一个AutoIt脚本:

#include  <Crypt.au3>
ConsoleWrite(StringLower(StringMid(_Crypt_HashData(Chr(128), $CALG_MD5),3)) & @CRLF)
Run Code Online (Sandbox Code Playgroud)

它返回我想要的哈希!但是我需要一个C#代码:)

Mar*_*ell 6

它归结为你使用哪种编码string转换为a byte[](因此我建议使用try UTF-8,因为这是一个非常常见的选择;但是,任何完整的unicode编码都可以工作,只要你知道使用哪个) ; 例如,根据字符串,"abc€"我们可以推断出第一个站点可能正在使用以下任何一个:

874: Thai (Windows)
936: Chinese Simplified (GB2312)
1250: Central European (Windows)
1252: Western European (Windows)
1253: Greek (Windows)
1254: Turkish (Windows)
1255: Hebrew (Windows)
1256: Arabic (Windows)
1257: Baltic (Windows)
1258: Vietnamese (Windows)
50227: Chinese Simplified (ISO-2022)
51936: Chinese Simplified (EUC)
52936: Chinese Simplified (HZ)
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会使用UTF-8!

这是我用来找到候选编码的代码:

    MD5 md5 = new MD5CryptoServiceProvider();
    foreach (var enc in Encoding.GetEncodings())
    {
        byte[] textToHash = enc.GetEncoding().GetBytes("abc€");
        byte[] result = md5.ComputeHash(textToHash);
        var output = BitConverter.ToString(result).Replace("-", "").ToLower();
        if(output == "7a66042043b2cc38ba16a13c596d740e")
        {  // result from http://www.md5hashgenerator.com/index.php
            Console.WriteLine(enc.CodePage + ": " + enc.DisplayName);
        }
    }
Run Code Online (Sandbox Code Playgroud)

此外,使用字符串进行测试"dnos ??q??d??"表明第二个站点肯定使用UTF-8; 第一个站点找不到匹配项,所以我猜它是使用基于代码页的编码,简而言之,它不能可靠地使用全系列的unicode.