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

时间:2014-06-30 18:31:09

标签: c# .net datatable hashcode

我有一个Datatable,我想在编辑数据表的行之前和之后比较每行的哈希码 这就是我如何获得HashCode,将其与密钥一起存储在字典中并返回它

        Dictionary<string, int> mydict1= new Dictionary<string, int>();

        foreach (DataRow row in DataTable.Rows)
        {
            mydict.Add(row["Name"].ToString(), row.GetHashCode());
        }

        return mydict1;

在编辑datatable行中的值之后,我再次调用相同的函数并获取行的所有哈希码值并将其存储在mydict2中。 当我比较mydict1和mydict2它们完全相同时,甚至认为我已经对行进行了编辑。如何捕获编辑内容?或者我如何才能获得最初连续值的哈希码?也许我没有正确获取哈希码,请帮忙。

2 个答案:

答案 0 :(得分:4)

我假设您没有使用自定义DataRow类,并且您希望GetHashcode根据DataRow的内容返回某种“校验和”值

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

来自MSDN

  

哈希码是一个数值,用于插入和标识基于散列的集合中的对象,例如Dictionary<TKey, TValue>类,Hashtable类或从{派生的类型{1}}上课。

DictionaryBase的默认行为返回对象的相等实例的相等哈希码,而不管该对象中的任何基础值,这就是为什么你之前得到相同的值改变之后。

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

如果您想可靠地查看某行是否已被修改,您必须保留以前值的副本并逐列进行比较 。任何散列算法都可以为具有不同列值的行生成相同的校验和。

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

答案 1 :(得分:0)

我使用一种方法来验证来自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();
        }
    }

为使数据行成为字符串值,我执行了以下操作:

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

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

然后我将此值存储在数据库中,并比较单个哈希以验证行已更改。如果不匹配,那么我将对单个项目的更改处理到数据库中。

这对我来说一直很好。