GetHashCode 方法可由派生类型重写。如果 GetHashCode 未重写,则通过调用基类的 Object.GetHashCode 方法来计算引用类型的哈希代码。

  引用类型:Object.GetHashCode方法会根据对象的引用计算哈希代码。若引用相等,则散列值一定相等,反之不一定成立。

  值类型:ValueType.GetHashCode方法使用反射基于该类型字段的值来计算散列值。若字段具有相等值,则散列值相同。

  哈希函数必须具有以下属性:

  1.若两个对象的比较结果相等,则每个对象的 GetHashCode() 方法必须返回相同的值。 但若两个对象的比较结果不相等,也有可能得出相同的散列值。

  2.若对象状态不会改变,则对象的 GetHashCode() 方法必须始终返回相同的散列值。(仅适用于当前运行的应用程序,如果重新运行应用程序,则可能返回不同的散列值)

  3.为了获得最佳性能,哈希函数应为所有输入生成偶数分布,其中包括大量聚集输入。这意味着,对对象状态的小修改应该会导致对生成的哈希代码进行较大的修改,以获得最佳的哈希表性能。

  4.哈希函数的计算成本应较低。

  5.重写 GetHashCode() 的派生类还必须重写 Equals(Object),以保证视为相等的两个对象具有相同的哈希代码。如果重写的 Equals 方法在测试两个对象是否相等时返回 true,则重写的 GetHashCode 方法必须为这两个对象返回相同的值。否则,Hashtable 类型可能无法正常工作。

  哈希代码适用于基于哈希表的集合中的高效插入和查找。 哈希代码不是永久值。 出于此原因:

  1.不要序列化哈希代码值或将其存储在数据库中。

  2.不要使用哈希代码作为密钥来检索键控集合中的对象。

  3.不要跨应用程序域或进程发送哈希代码。 在某些情况下,可以基于每个进程或每个应用程序域来计算哈希代码。

  4.如果需要加密型强哈希,请不要使用哈希代码。 对于加密哈希,可以使用 System.Security.Cryptography.HashAlgorithm 或 System.Security.Cryptography.KeyedHashAlgorithm。

  5.不要测试哈希代码是否相等,以确定两个对象是否相等。 (不相等的对象可以具有相同的哈希代码。)若要测试是否相等,可以调用 ReferenceEquals 或 Equals 方法。

  Hashcode可以存储在对象的同步块中。若对象状态未改变,则只需首次计算哈希,之后直接取值。

GetHashCode之于引用类型和值类型及其特性的更多相关文章

  1. C# 引用类型和值类型

    C# 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 1.引用类型 (1)内存必须从托管堆上分配: (2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员 ...

  2. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  3. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  4. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  5. 【C#进阶系列】05 基元类型、引用类型和值类型

     基元类型和FCL类型 FCL类型就是指Int32这种类型,这是CLR支持的类型. 而基元类型就是指int这种类型,这是C#编译器支持的,实际上在编译后,还是会被转为Int32类型. 而且学过C的朋友 ...

  6. NET中的引用类型和值类型 zt

    .NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序 的效率.本文视图对.NET 基础类型中的值类型和引用类 ...

  7. [CLR via C#]5.2 引用类型和值类型

    原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...

  8. CLR via C#读书日记一' 引用类型和值类型'

    CLR支持两种类型:引用类型和值类型. 引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址. 使用引用类型必须注意到一些问题: 1)内存必须从托管堆上 ...

  9. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

随机推荐

  1. 让IIS支持解析.json格式文件

    原文出处链接及本声明. 原文链接:https://blog.csdn.net/jumtre/article/details/72630730 1.IIS内点击网站进入网站主页设置界面: 2.双击MIM ...

  2. DNS域名解析系统_1

    DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...

  3. Go语言中使用切片(slice)实现一个Vector容器

    Go语言中的切片(slice)和一些内置函数能实现其他语言容器类Array.Vector的功能,但是Go内置语言包container里只提供了list.heap.ring三种容器,缺少vector容器 ...

  4. 最新 斗鱼java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.斗鱼等10家互联网公司的校招Offer,因为某些自身原因最终选择了斗鱼.6.7月主要是做系统复习.项目复盘.LeetCode ...

  5. JavaScript 检测值

    了解常见的真值和假值,可以增强判断能力.在使用if判断时,提升编码速度. 了解常见的检测和存在,一样可以增强判断能力,而且是必须掌握的. 数组和对象被视为真值 1 2 3 4 5 6 7 8 9 10 ...

  6. python xlrd模块

    一.什么是xlrd模块? Python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 二.使用介绍 1.常用单元格中的数据类型 类型 含义 e ...

  7. SQL 十位随机数(大小写字母+数据)

    USE [TEST]GO/****** Object: UserDefinedFunction [dbo].[RANDTENNUMS] Script Date: 2019/7/23 15:40:16 ...

  8. win7 配置 用户/系统DSN (解决plsql odbc导入器 DSN 没有选项)

    (2013-05-07 15:07:29) 转载▼ 标签: it   老笔记本越来越卡,最近重新做了win7的系统 从sql server中导出的 excel文件 准备通过plsql倒入的oracle ...

  9. sshpass ssh登录时自动输入密码

    安装 直接安装 sudo apt-get install sshpass 源代码安装 wget http://sourceforge.net/projects/sshpass/files/sshpas ...

  10. Python实现乘法表——在列表里进行for循环设初值

    代码:最大的收获是二维列表的实现:[0]*9结果是[0,0,0,0,0,0,0,0,0,0],再加上for i in range(9),代表是9行[0,0,0,0,0,0,0,0,0,0],也就是9* ...