我正在对一个活动目录进行一些查询,建立我自己的词典,以包含每个用户的姓名,电话和电子邮件。
然后我将用户存储到一个文件,如下所示:
域\ groupt \组\用户; <checksum>
之前的路径;是用户的唯一ID(用户可以在不同的组中,因此我必须跟踪它),<checksum>
是该用户的该Dictinary对象的.GetHashCode()。
然后我有一个计时器,每30秒检查一次AD并为用户建立相同的dictinary,并从文件中查找id和校验和。
但这不起作用。出于某种原因.GetHashCode()在名称,电话或电子邮件没有变化时生成一个新的int ...所以我认为它不是要使用的功能。
那么我怎样才能检查对象是否按照我上面描述的方式进行了更改?
答案 0 :(得分:1)
您可能必须覆盖用户对象的GetHashCode方法才能创建自定义方法。
像
这样的东西public override int GetHashCode()
{
return string.Concat(this.Domain,this.Name,...).GetHashCode();
}
但是,无论如何比较HashCodes只能确保当结果不同时对象不相等,如果哈希码相同,你仍然需要检查内容是否相同。 HashCode对于在Hastables中分发对象很有用,但不能用于真正的比较。
您最好在班级中实施IComparable
界面。
答案 1 :(得分:0)
尝试覆盖GetHashCode()
以返回唯一的内容。
答案 2 :(得分:0)
我怀疑你的哈希码正在改变的原因是你没有在你的类中覆盖组合你的三个字段的GetHashCode(),所以它使用默认的实现,它将返回特定于特定对象的哈希码(而不是它的值) )。但是,我建议不要使用GetHashCode
来解决您的问题,因为您需要将这些值保存到磁盘并在应用程序的调用之间有用。
GetHashCode()
返回一个只能在单个流程实例(单次运行)的上下文中依赖的哈希。 GetHashCode
的实现可以自由地返回基于元素的内存排序的值,这些元素可以在进程运行之间进行更改,此外,生成的值可能在进程体系结构之间或.NET版本之间不同。有关详细信息,请参阅documenation of GetHashCode。
如果您想要在保存到磁盘并重新加载时可以依赖的东西,则应切换到具有明确定义的行为的哈希函数(或者,您可以控制)。可以在“list of hash functions”维基百科页面上找到此类算法的列表。特别是,非加密的适用于此任务。 (虽然没有理由,除了性能之外,为什么你不能使用加密的。)
答案 3 :(得分:0)
我没有看到的一点是,当你覆盖GetHashCode()时,你还应该覆盖Equals()以保持一致性并避免意外行为。