Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象的MD5散列根据调用它的程序给出不同的结果_C#_Object_Hash_Cryptography_Md5 - Fatal编程技术网

C# 对象的MD5散列根据调用它的程序给出不同的结果

C# 对象的MD5散列根据调用它的程序给出不同的结果,c#,object,hash,cryptography,md5,C#,Object,Hash,Cryptography,Md5,我将一个旧程序迁移到一个新版本(控制台应用到WPF),我遇到了md5哈希的问题 它是一个导入程序(获取XML,序列化它,转换数据并存储在DB中)。为了避免重复数据,我在导入之前设置了对象的哈希,以检查数据是否已经存在。 这个控制台程序很旧,而且对非IT人员来说是用户友好的,所以我需要将其放入WPF版本,更易于使用:) 但是当我询问哈希值时,我得到了不同的结果>\up>好的! 因此,这是框架的一个问题。我把WPF设置为3.5,一切正常 我只需要重做一些功能: Wait/async在3.5中不起作

我将一个旧程序迁移到一个新版本(控制台应用到WPF),我遇到了md5哈希的问题 它是一个导入程序(获取XML,序列化它,转换数据并存储在DB中)。为了避免重复数据,我在导入之前设置了对象的哈希,以检查数据是否已经存在。 这个控制台程序很旧,而且对非IT人员来说是用户友好的,所以我需要将其放入WPF版本,更易于使用:) 但是当我询问哈希值时,我得到了不同的结果>\up>好的! 因此,这是框架的一个问题。我把WPF设置为3.5,一切正常 我只需要重做一些功能:

  • Wait/async在3.5中不起作用,因此搜索并查找3.5的AsyncBridge
  • FileHelpers停止了编译,因此我被迫使用2.0而不是3.5
我对不得不降级并不十分满意,但它至少起到了作用:(


感谢所有阅读并试图帮助我的人!:)

请看下面的答案:不幸的是,已经检查过了:/它是读取XML的同一个类,并且是从同一台计算机(我的)启动的,因此没有编码问题:/这不是MD5问题。问题在于序列化程序。你的应用程序必须使用不同版本的.NET。确实如此,但为什么我会为每个项目获得相同的哈希值(铸造(类列表):控制台和wpf中相同,持续时间:相同,…控制台中的全局15C89448FAB23ADE2AABA37EFF2C3B1A和wpf中的BB33D5520D38D4DC412B91E87F04E77D)OOOOOOO KAY。。。所以我把我的wpf项目放在框架3.5中,我有很好的散列…(但为什么它对4.6.1中的子项很好?),除非有人有好的想法,否则我必须重做很多函数才能让它们在3.5中工作:/
        //Catch unuseful parameter values
        if (sourceObject == null)
        {
            throw new ArgumentNullException("Null as parameter is not allowed");
        }
        else
        {
            //We determine if the passed object is really serializable.
            try
            {
                //Now we begin to do the real work.
                hashString = ComputeHash(ObjectToByteArray(sourceObject));
                return hashString;
            }
            catch (AmbiguousMatchException ame)
            {
                throw new ApplicationException("Could not definitely decide if object is serializable. Message:" + ame.Message);
            }
        }
    }

    private static string ComputeHash(byte[] objectAsBytes)
    {
        MD5 md5 = new MD5CryptoServiceProvider();
        try
        {
            byte[] result = md5.ComputeHash(objectAsBytes);

            // 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();
        }
        catch (ArgumentNullException ane)
        {
            //If something occurred during serialization, 
            //this method is called with a null argument. 
            Console.WriteLine("Hash has not been generated.");
            return null;
        }
    }

    private static readonly Object locker = new Object();

    private static byte[] ObjectToByteArray(Object objectToSerialize)
    {
        MemoryStream fs = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        try
        {
            //Here's the core functionality! One Line!
            //To be thread-safe we lock the object
            lock (locker)
            {
                formatter.Serialize(fs, objectToSerialize);
            }
            return fs.ToArray();
        }
        catch (SerializationException se)
        {
            Console.WriteLine("Error occurred during serialization. Message: " + se.Message);
            return null;
        }
        finally
        {
            fs.Close();
        }
    }
}