C#中的对象有四种方法 - {Equals
,GetType
,ToString
, GetHashCode
}。
有人可以用散列码做什么有用的事情?如何处理.NET对象散列码?
回答
有人可以用哈希码做什么有用的事情?
快速找到潜在等于对象。
特别是,此方法通常使用的类型如Dictionary<TKey, TValue>
(用于密钥)和HashSet<T>
。
您应该而不是然而,假设具有相同散列码的对象相等。有关更多信息,请参阅Eric Lippert's blog post;有关散列码使用的更一般性讨论,请参阅Wikipedia hash table页面。
哈希码是一个数值,用于在进行相等性测试期间标识对象 。它也可以作为集合中对象 的索引。
GetHashCode方法适用于散列算法和散列表等数据结构。
GetHashCode方法的默认实现不是 保证了不同对象的唯一返回值。此外,.NET Framework不保证 GetHashCode方法的默认实现,并且它返回的值将在 不同版本的.NET Framework之间相同。因此,不得将此方法的默认实现用作散列目的的唯一对象 标识符。
GetHashCode方法可以被派生类型覆盖。值 类型必须重写此方法以提供适用于该类型的散列函数 并在散列表中提供有用的分布。为了唯一性,哈希码必须基于实例字段或属性的值 而不是静态字段或 属性。
用作Hashtable对象中的键的对象还必须覆盖 GetHashCode方法,因为这些对象必须生成其自己的散列 代码。如果用作键的对象没有提供有用的GetHashCode实现,则可以在构建Hashtable对象时指定哈希代码提供程序 。在.NET Framework 版本2.0之前,散列码提供程序基于 System.Collections.IHashCodeProvider接口。从版本 2.0开始,哈希码提供程序基于 System.Collections.IEqualityComparer接口。
的基本想法是,如果两个物体有不同的hash code,它们是不同的。如果它们具有相同的哈希码,则它们可以不同或相等。
要检查某个对象是否存在于一个集合中,您可以首先检查哈希码,因为您正在比较整数,所以它会很快检查,然后仅对具有相同哈希码的对象执行更准确的测试。例如,
这被用在集合类中。
的GetHashCode
GetHashCode
只存在这两种类型
的利益 - >哈希表
- >GenericDictionary
的GetHashCode为您提供了良好的hashtable
表现多样键。
Equals为当类型是在编译时未知一个null-safe
相等比较。 其签名是
public static bool Equals(object A,object B)
。
所以你不能使用运营商如==
或!=
如果类型是在编译time.You未知已Equals
它有用编写泛型类型
例如,当使用方法:
class Test<T>
{
T value;
public void SetV(T newValue)
{
if(object.Equals(newValue,value))
//We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time
}
}
ToString
它返回一个类型实例的默认texual representation
.Thi S分析是所有内建类型
的GetType
GetType
在runtime.It评估重写帮助我们知道是什么类型的name
,assemby
,base type
..和别人
- 1. hashmap如何处理负散列码?
- 2. 如何使用SHA1对密码文件进行散列处理
- 3. .Net对象对应于IronRuby散列
- 4. 在.NET中处理对象?
- 5. 散列冲突如何处理?
- 6. Ruby可以处理大型散列对象
- 7. 存储持久V8对象处理的散列容器
- 8. 理解散列码
- 9. 如何处理XMLDocument对象
- 10. 如何处理googlemap对象?
- 11. PHP如何处理对象
- 12. 如何处理对象
- 13. 记录对象散列码有用吗?
- 14. 在.NET中处理单例对象
- 15. 散列JavaScript对象
- 16. 如何使用SAS散列对象?
- 17. 如何从散列表返回对象
- 18. 如何加密散列JSON对象?
- 19. 散列表碰撞处理
- 20. 在.net远程处理对象中处理异常
- 21. 如何确保在.NET中正确处理对象?
- 22. 如何处理.net对象中的事务?
- 23. .NET Remoting:如何处理断开的对象
- 24. .NET N层体系结构:我该如何处理Model对象?
- 25. 我应该如何处理.NET对象中的组合键
- 26. 如何处理这对新的对象
- 27. 有理数的散列码
- 28. 处理对象
- 29. Angular.js从散列/对象
- 30. 在Java中散列对象?
钥匙?是不是通过equals方法认为键是不同的? (IEquatable)? –
@RoyiNamir:是的,但他们首先*通过哈希码进行比较 - 因为这样可以便宜地获得*潜力*匹配。否则,每次从字典中提取都需要检查每个密钥的均等性。 –
为什么编译器会打扰做潜在的匹配,如果等于可以破坏它的假设? (我知道重写等于要求重载getHashCode) - 但那是另一个问题。 –