我有一个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它们完全相同时,甚至认为我已经对行进行了编辑。如何捕获编辑内容?或者我如何才能获得最初连续值的哈希码?也许我没有正确获取哈希码,请帮忙。
答案 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并返回以逗号分隔的字符串。
然后我将此值存储在数据库中,并比较单个哈希以验证行已更改。如果不匹配,那么我将对单个项目的更改处理到数据库中。
这对我来说一直很好。