2015-03-13 25 views
0

这里是C#如何在C#和Ruby中匹配输出格式MD5哈希字符串?

public static string GetMD5Hash(string input) 
    { 
     System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
     bs = x.ComputeHash(bs); 
     System.Text.StringBuilder s = new System.Text.StringBuilder(); 
     foreach (byte b in bs) 
     { 
      s.Append(b.ToString("x2").ToLower()); 
     } 
     return s.ToString(); 

    } 

下面的代码的Ruby代码

def getMD5Hash(str) 
     bs = Digest::MD5.digest(str.encode('UTF-8')).bytes.to_a 
     bs = bs.map { |b| b.to_s(16).downcase } 
     str_bs = bs.join 
     return str_bs 
end 

当我运行Ruby代码和C#代码相同的字符串加密,从Ruby的结果是不一样的结果如C#提供。 如何修改Ruby代码?非常感谢

+0

的C#示例使用UTF8但Ruby例如使用UTF-16。你为什么期望他们是一样的? – Martheen 2015-03-13 06:37:01

+0

我修改了编码为UTF8,但它不一样。谢谢 – 2015-03-13 06:52:04

回答

0

我不是一个红宝石程序员,但是如何转换为十六进制是错误的。它看起来像'0a'这样的值呈现为'a',从而导致输出不正确。 Ruby已经有了一个方法,但是,Digest::MD5.hexdigest,所以我不知道为什么有人会推出自己的。

我会写红宝石功能:

def getMD5Hash(str) 
    return Digest::MD5.hexdigest(str.encode('UTF-8')) 
end 
+0

我尝试在ruby中更改utf-8,但结果并不相同。我需要如何修改ruby代码?非常感谢 – 2015-03-13 06:43:11

+0

@JiameiWan查看我的更新。 Ruby代码有一个bug,但我不知道足够的红宝石指向确切的错误。改为使用'Digest :: MD5.hexdigest'。 – 2015-03-13 06:45:35

+0

您的意思是:Digest :: MD5.hexdigest(str)? – 2015-03-13 06:51:13