2014-09-03 90 views
1

我試圖獲得兩個不同列表的MD5哈希值,因此我可以很容易地判斷列表是相同還是不同。但是,即使它們具有不同的內容,我仍然爲這兩個列表獲得相同的MD5哈希值。對於不同的字符串計算MD5值返回「0001..0E0F」

HASH1:000102030405060708090A0B0C0D0E0F

HASH2:000102030405060708090A0B0C0D0E0F

他們應該是不同的,因爲列表中的內容是不同的,對不對?

using System; 
using System.Collections.Generic; 
using System.Security.Cryptography; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var md5Hash = MD5.Create(); 
      var list1 = new List<string> { "1", "dog", "cat", "mouse" }; 
      var list2 = new List<string> { "2", "dog", "cat", "mouse"}; 
      var md5 = new Md5Hash(); 
      var joined1 = string.Join(",", list1.ToArray()); 
      var joined2 = string.Join(",", list2.ToArray()); 
      var hash1 = md5.GetMd5Hash(md5Hash, joined1); 
      Console.WriteLine("hash 1: {0}", hash1); 
      var hash2 = md5.GetMd5Hash(md5Hash, joined2); 
      Console.WriteLine("hash 2: {0}", hash2); 
      Console.ReadKey(); 
     } 


    } 
} 

我懷疑問題是與正在生成Md5hash方法...

internal string GetMd5Hash(HashAlgorithm md5Hash, string input) 
     { 
      // Convert the input string to a byte array and compute the hash. 
      var data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); 

      // Create a new Stringbuilder to collect the bytes 
      // and create a string. 
      var stringBuilder = new StringBuilder(); 

      // Loop through each byte of the hashed data 
      // and format each one as a hexadecimal string. 

      for (var i = 0; i < data.Length; i++) 
      { 
       stringBuilder.Append(i.ToString("X2")); 
      } 

      // Return the hexadecimal string. 
      return stringBuilder.ToString(); 
     } 

var data變量並在兩個列表中返回不同的數據,但該方法返回相同的字符串。

回答

7
stringBuilder.Append(i.ToString("X2")); 

這只是給你,你正在使用的數組索引i的十六進制值,並且是爲什麼你MD5s顯得如此的原因......「有計劃」(序列號從0x00爲0x0F)。

你需要的東西,如:

stringBuilder.Append(data[i].ToString("X2")); 

i位置獲得哈希的值。

6

000102030405060708090A0B0C0D0E0F

注意這些怎麼是數字00到0F,爲了。

for (var i = 0; i < data.Length; i++) 
{ 
    stringBuilder.Append(i.ToString("X2")); 
} 

要追加在十六進制i,其迭代從00到0F。 data[i]可能會更好。