我必须将下面的代码中的C#哈希复制到PHP中。我一直在寻找,但到目前为止找不到解决方案。
来自this article on creating an md5 hash string:
using System;
using System.Text;
using System.Security.Cryptography;
// Create an md5 sum string of this string
static public string GetMd5Sum(string str)
{
// First we need to convert the string into bytes, which
// means using a text encoder.
Encoder enc = System.Text.Encoding.Unicode.GetEncoder();
// Create a buffer large enough to hold the string
byte[] unicodeText = new byte[str.Length * 2];
enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);
// Now that we have a byte array we can ask the CSP to hash it
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(unicodeText);
// Build the final string by converting each byte
// into hex and appending it to a StringBuilder
StringBuilder sb = new StringBuilder();
for (int i=0;i<result.Length;i++)
{
sb.Append(result[i].ToString("X2"));
}
// And return it
return sb.ToString();
}
对于input =“123”,上面的代码给出了“5FA285E1BEBE0A6623E33AFC04A1FBD5”
我尝试过以下PHP代码,但它没有提供相同的输出。
来自SO问题PHP MD5 not matching C# MD5:
$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);
此代码的结果为“a0d5c8a4d386f15284ec25fe1eeeb426”。顺便说一下,将UTF-32LE改为utf-8或utf-16仍然不会给我相同的结果。
有人可以帮忙吗?
答案 0 :(得分:2)
是的,正如CodesInChaos所说,你的编码错了。
在php端试试这个:
$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-16LE");
echo md5($strUtf32);
这会给你5FA285E1BEBE0A6623E33AFC04A1FBD5
。这将匹配c#侧的System.Text.Encoding.Unicode
。
否则请在c#端将System.Text.Encoding.Unicode
更改为System.Text.Encoding.UTF32
。这将为您提供A0D5C8A4D386F15284EC25FE1EEEB426
。
答案 1 :(得分:0)
呃,C#代码创建一个MD5哈希,而PHP mb_convert_encoding
函数只是对字符串进行编码...
另外,这不是您提供的链接的完整代码。您缺少重要的MD5功能:
$str = "123";
$strUtf32 = mb_convert_encoding($str, "UTF-16");
echo md5($strUtf32); <=====
如果该代码匹配,则应该没有原因,为什么这不起作用,因为MD5算法仍然相同,并且不会因语言而异。