首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么'397'用于ReSharper GetHashCode覆盖?

在 ReSharper(重构工具)中,GetHashCode 方法被重写了以支持增量计算和避免重复。这种方法使用"397"作为哈希值。这个数字实际上没有特别意义,它是一个固定的数字。然而,它在这个场景中被选为代表 ReSharper 中使用的哈希算法的特点。

hashCode 方法的工作原理如下:

  1. 根据对象属性进行哈希计算。
  2. 使用"397"作为哈希值的基本计算方法。
  3. 根据哈希值实现冲突解决,如链地址法、二次探测法或 开放寻址法。

哈希值的作用:

  1. 确保对象在不同的哈希表中能够高效地处理,避免哈希碰撞和冲突。
  2. 减少哈希表大小,减少插入、查找、删除等操作所需的时间。

需要注意的是,"397" 用于 ReSharper GetHashCode 覆盖只是用于 ReSharper 重构工具中的一种固定的哈希算法实现方法。在实际场景中,可能需要使用更优或特定于应用程序或库的哈希算法。同时,为了确保代码的可测试性、正确性和可读性,建议始终为 hashCode 方法提供合适的实现,以便在应用程序中正确且高效地进行哈希计算。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# - 为值类型重定义相等性

为什么要为值类型重定义相等性 原因主要有以下几点: 值类型默认无法使用 == 操作符,除非对它进行重写 再就是性能原因,因为值类型默认的相等性比较会使用装箱和反射,所以性能很差 根据业务需求,其实际相等性的意义和默认的比较结果可能会不同...(如果你使用resharper或者Rider,那么实现该接口的时候它会自动把object的Equals和GetHashCode方法都重写了,并且自动完成了有意义的代码) ?...这个代码是resharper生成的。...所以如果重写了object.Equals()方法,那么就得重写object.GetHashCode()方法。 看一下resharper自动实现的代码: ?...之所以使用397这个数,可能因为397是一个足够大的质数,可以导致溢出,并混淆各位,之所以使用质数,是因为用质数相乘会得到比用其他任意数相乘更均匀的结果。 检验 ? ? 结果如预期,OK。

1.1K20

dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值

在 C# 里面,所有的对象都继承 Object 类型,此类型有开放 GetHashCode 用于给开发者重写。...此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个对象在 Equals 返回相等时,两个对象的 GetHashCode 返回值也相等。...如果在 GetHashCode 里面使用的字段或属性非只读,那么 ReSharper 将会警告你这是不安全的。...本文将来告诉大家为什么这是不安全的 在 dotnet 里面,大部分会用到 GetHashCode 的逻辑都在于哈希容器里面,如 Dictionary 字典等。...也许某个逻辑变更了这些非只读字段或属性的时候,影响了 GetHashCode 的返回值从而影响了哈希容器的行为 这就是为什么 ReSharper 警告不要在 GetHashCode 里面使用非只读字段或属性进行制作哈希值的原因

61120
  • GetHashCode重写指南(译文)

    我经常遇到重写GetHashCode需要注意事项的问题,因而,我在这里总结一下: GetHashCode的作用 设计仅用于在一个hash表中放置,索引一个对象。...为什么对象需要这样的一个方法 在类型系统中的每个对象都应该提供一个 GetType 的方法, 这是完全合理的。数据自描述能力是 CLR 类型系统的一个关键特性。...但是, 为什么每个对象都要求能在哈希表中插入自己的哈希值呢?要求每一个对象能够做到似乎是一个奇怪的事情。...Security issue:不要把GetHashCode用于其他用途 GetHashCode设计仅用于平衡hash表,不用用作其他用途,特别是: 没有给对象提供唯一键,碰撞几率非常高。...没有进行高度加密,因而不能用于签名或者密码的一部分 它不一定有校验的检错性能。 正确地处理所有这些事情是非常棘手的。

    1.1K60

    框架设计原则和规范(四)

    要在覆盖Equals方法同时覆盖GetHashCode方法 C. 考虑在覆盖Object.Equals方法的同时实现IEquatable接口 D.不要从Equals方法中抛出异常 E....b) 不要为可变的引用类型实现“值相等”语义 2) Object.GetHashCode A.覆盖了Object.Equals就要覆盖GetHashCode方法 B....确保任何两个对象,如果Object.Equals返回true,那么它们的GetHashCode方法返回值也相同 C....要竭尽所能的让GetHashCode方法产生随机分布的散列码 D.要确保无论怎么更改对象,GetHashCode都返回完全相同的值 E....避免在GetHashCode方法中抛出异常 3) Object.ToString A.要覆盖ToString方法——只要能返回既有用,又易于让人阅读的字符串 开发人员是查看返回的字符串的人员。

    1.5K40

    精:C# 泛型集合类List使用总结

    为什么选择使用List,而不是使用Array,或者ArryList 首先要说下数组的局限性 (1) 数组中元素是固定的:类型和数量都必须确定!...当然使用Linq中GoupBy + Select等方法还是可以做到去重的,但是这里说的并不是这些东西,而是直接使用Intersect、Except、Distinct、Union 那么为什么引用类型不能直接比较呢...因此要想比较,先把他的值点出来比较,可以只比较某一个值,也可以是全部 重写Equals() 和 GetHashCode() 为什么要重新呢,因为这些比较方法的内部就是调用者两个方法进行比较的,他们仅适用于值类型的比较...([DisallowNull] Person obj) { return obj.name.GetHashCode() + obj.age.GetHashCode();...() + obj.age.GetHashCode(); //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 两种写法都可以

    35830

    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core 的整个架构中...services.AddControllers(); } 在 Controller 里面获取我们的服务 // FromServices 标注的作用是从容器里面获取我们的对象 // 每个对象获取两遍,用于对比每个生命周期获取的对象是什么样子的...()}"); Console.WriteLine($"singleton2:{singleton2.GetHashCode()}"); Console.WriteLine($"transient1...:{transient1.GetHashCode()}"); Console.WriteLine($"transient2:{transient2.GetHashCode()}"); Console.WriteLine...($"scoped1:{scoped1.GetHashCode()}"); Console.WriteLine($"scoped2:{scoped2.GetHashCode()}");

    49010

    VisualStudio中的单元测试

    VisualStuio中的测试资源管理器、CodeLens和ReSharper 上一篇文章重温了《单元测试的艺术》里提到的单元测试的技术及原则。...但CodeLens的图标常常刷不出来,一些第三方插件(如ReSharper)会更好用。 2....指示单元测试是否充分覆盖代码,并显示未被单元测试覆盖的代码。 Live Unit Testing 以图形方式实时描绘代码覆盖率,以便一眼就能看到每行代码覆盖的测试数,目和未被任何单元测试覆盖的行。...因此,存根类型不能用于静态方法、非虚方法、密封虚方法、密封类型中的方法,等等。 内部类型。...存根提供了可用于测试的接口和抽象方法的实现。 填充码无法检测接口和抽象方法,因为它们没有方法体。

    3.7K50

    哈希算法 数据结构_实现哈希表构造和查找算法

    个元素要存储,那我们就用l个内存单元来存储他们 然后我们有一个哈希函数f(x),我们把元素n用函数计算得到哈希值,也就是f(n) f(n)就是存储元素n的那个内存单位的位置,也就是元素在l中的下标 2.为什么哈希表查询速度快...理解了哈希表的基本思路,我们也就不难理解为什么哈希表查询效率高了: 由于每个元素都能通过哈希函数直接计算获得地址,所以查找消耗时间非常少。...07-04 11:36 * @Description:哈希表 */ public class HashTable { //数组长度 private int size; //用于存放数据的数组...* @param item */ public void insert(int item) { //获取哈希值 int hashCode = getHashCode...* @param item */ public void show(int item) { //获取哈希值 int hashCode = getHashCode

    60520
    领券