【问题标题】:Computing MD5 value returns "0001..0E0F" for different strings计算 MD5 值对于不同的字符串返回“0001..0E0F”
【发布时间】:2014-09-03 10:37:55
【问题描述】:

我正在尝试获取两个不同列表的 MD5 哈希,以便我可以轻松判断这些列表是相同还是不同。但是,即使它们具有不同的内容,我仍然会为这两个列表获得相同的 MD5 哈希值。

哈希1:000102030405060708090A0B0C0D0E0F

哈希2: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 变量确实在两个列表之间返回不同的数据,但该方法返回相同的字符串。

【问题讨论】:

    标签: c# hash md5


    【解决方案1】:
    stringBuilder.Append(i.ToString("X2"));
    

    这只是给你 数组索引 i 你正在使用的十六进制值,这就是为什么你的 MD5 看起来如此......“计划”(从 0x00 到0x0f)。

    你需要这样的东西:

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

    i位置获取散列中的值

    【讨论】:

      【解决方案2】:

      000102030405060708090A0B0C0D0E0F

      注意这些数字是从 00 到 0F 的顺序。

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

      您正在以十六进制形式附加 i,它从 00 迭代到 0F。 data[i] 可能会更好。

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 2015-09-18
        • 1970-01-01
        • 2016-01-19
        • 2015-10-20
        • 2012-07-24
        • 1970-01-01
        • 2023-02-25
        • 1970-01-01
        相关资源
        最近更新 更多