Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# 通过字节序列化比较对象_C#_Object_Serialization_Comparison_Md5 - Fatal编程技术网

C# 通过字节序列化比较对象

C# 通过字节序列化比较对象,c#,object,serialization,comparison,md5,C#,Object,Serialization,Comparison,Md5,因此,我有一个对象,它将存储在数据库表中或在文件中找到;用于更新该表。我们需要在表和更新文件之间进行比较,以避免更新时出现重复 我解决这个问题的第一次尝试是执行一个字符串。在字段上加入,然后将其转换为字节,最后对字节数组进行md5哈希。问题是我们有时会得到一个空字符串,当一些(但不是全部)字段为空时 因此,我们决定采用的第二种方法是将对象序列化为字节,然后对其字符串进行md5哈希。到目前为止,这还不错,但我注意到它可能不稳定(例如,如果有人更新.net版本) 这是我需要担心的事吗 需要它的人的示

因此,我有一个对象,它将存储在数据库表中或在文件中找到;用于更新该表。我们需要在表和更新文件之间进行比较,以避免更新时出现重复

我解决这个问题的第一次尝试是执行一个
字符串。在字段上加入
,然后将其转换为字节,最后对字节数组进行md5哈希。问题是我们有时会得到一个空字符串,当一些(但不是全部)字段为空时

因此,我们决定采用的第二种方法是将对象序列化为字节,然后对其字符串进行md5哈希。到目前为止,这还不错,但我注意到它可能不稳定(例如,如果有人更新.net版本)

这是我需要担心的事吗

需要它的人的示例代码:

public void GenerateHash()
    {
        md5 = returnHash();
    }

    public byte[] returnHash()
    {
        if (this == null)
            return null;
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, this);
        string str = System.Text.Encoding.Default.GetString(ms.ToArray());
        return SensitiveNamespace.Hashing.MD5(str).ToBytes();
    }
我注意到它可能不稳定(如果有人 更新.net版本(例如)

这是我需要担心的事吗

你把散列和什么做比较?是否持久化数据库数据的哈希值?如果不是,也就是说,如果您在运行时计算它们,应该不会有问题

如果是这样的话,您可以在应用程序启动时执行某种验证作业,以验证哈希值,并在必要时对其进行更改

由于您无法控制的部分是序列化代码,也许您应该回到字符串连接方法,并包括一些保证唯一的字段组合。

BinaryFormatter将程序集的类型+版本存储在序列化数据中。如果将代码升级到新版本,将无法获得相同的二进制数据。因此,我将使用Xml或Json作为序列化格式

例如:(使用)


顺便说一句:您可以通过使用
SHA256

来减少冲突的机会。在未随后比较未删除的数据之前,不应使用哈希进行相等比较。如果散列不同,对象将不同,但如果散列相同,则对象仍有可能不同。这是一个公平的观点,但我们对md5冲突的概率没有异议。这篇文章展示了发生md5冲突的可能性极小:你可能是对的,但你也应该记住,你实际上并不是在谈论随机哈希。相反,它们都来自结构相似的数据。我不知道这是否会使碰撞的几率更高、更低或相同,但我怀疑这会使它们更高。@Ukemi BinaryFormatter将程序集的type+版本存储在序列化数据中。如果将代码升级到新版本,将无法获得相同的二进制数据。因此,我将使用Xml或Json作为序列化格式。@L.B这是一个很好的观点。好吧,我就这么做。我不知道为什么要投反对票,这是一个公平的答案,所以+1。也就是说,这对我来说不起作用,因为我们正在讨论的行的数量使这变得不可预测(并非不可能)。@Ukemi在这种情况下,您必须考虑如果序列化代码更改,哈希值全部更改,会发生什么情况。可能结果是应用程序在一段时间内运行较慢,因为它不必要地重新保存未更改的对象。也许这是可以接受的。我用你的回答,成功了。但我想在这里指出,我有很多行,当我必须进行比较时,速度很重要。MD5哈希比SHA256快4倍,是SHA0的两倍。如果不是因为md5发生碰撞的可能性极低,我会接受sha的建议。尽管如此,这个建议对其他人还是有用的,如果需要的话,我可能会在将来使用它。
byte[] GenerateHash(object o)
{
    using (var sha = SHA256.Create())
    {
        var json = JsonConvert.SerializeObject(o);
        return sha.ComputeHash(Encoding.UTF8.GetBytes(json));
    }
}