2015-03-13 48 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