DataRow GetHashCode()方法的值不会在编辑行后改变

本文关键字:编辑 改变 GetHashCode 方法 DataRow | 更新日期: 2023-09-27 18:10:56

我有一个数据表,我想比较在对数据表的行进行编辑之前和之后每行的哈希码这就是我获取HashCode的方式,将它与键一起存储在字典中,并返回

        Dictionary<string, int> mydict1= new Dictionary<string, int>();
        foreach (DataRow row in DataTable.Rows)
        {
            mydict.Add(row["Name"].ToString(), row.GetHashCode());
        }
        return mydict1;

编辑完数据表行中的值后,我再次调用相同的函数并获得行的所有哈希码值并将其存储在mydict2中。当我比较mydict1和mydict2时,它们完全相同,即使我对行进行了编辑。我如何捕捉编辑?或者我如何获得一行中值的哈希码?也许我没有得到正确的哈希码,请帮助。

DataRow GetHashCode()方法的值不会在编辑行后改变

我假设您不使用自定义DataRow类,并且您期望GetHashcode根据DataRow的内容返回某种"校验和"值。

这不是GetHashCode所做的,也不应该。哈希码用于Dictionary 或其他基于哈希的集合中存储项。

从MSDN:

哈希码是一个数字值,用于在基于哈希的集合(如Dictionary<TKey, TValue>类、Hashtable类或从DictionaryBase类派生的类型)中插入和标识对象。

GetHashCode的默认行为为一个对象的相同实例返回相同的哈希码,而不管该对象中的任何底层值,这就是为什么您在更改之前和之后获得相同的值。

请阅读上面链接的其余文档,以了解哈希码的其他适当(和不适当)用法。

如果您希望可靠地查看一行是否已被修改,您必须保留先前值的副本并逐列比较它们。任何散列算法都可以对不同列值的行产生相同的校验和。

可以使用DataRowComparer.GetHashCode(),但请注意,它不能100%保证指示一行是否已更改。

我使用了一种方法来验证来自CSV的传入数据流是否发生了更改。最初我使用GetHAshCode()只是为了发现它不会像我想象的那样工作。

这就是我所做的....

我创建了一个SHA1哈希方法,如下所示:

    static string Hash(string input)
    {
        using (SHA1Managed sha1 = new SHA1Managed())
        {
            var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
            var sb = new StringBuilder(hash.Length * 2);
            foreach (byte b in hash)
            {
                // can be "x2" if you want lowercase
                sb.Append(b.ToString("X2"));
            }
            return sb.ToString();
        }
    }

为了将数据row转换为字符串值,我做了以下操作:

    string _szImportRecordHash = Hash(String.Join(",", drRow.ItemArray) );

上面的代码有一个String。Join,它接受itemArray并返回一个逗号分隔的字符串。

然后将该值存储在DB中,并比较单个散列以验证行是否已更改。如果不匹配,那么我将对单个项目的更改处理到DB中。