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