C#容器源码分析 --- Dictionary<TKey,TValue>
Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合,其核心实现基于哈希表和链地址法(Separate Chaining)。
.Net4.8 Dictionary<TKey,TValue>源码地址:
dictionary.cs (microsoft.com)https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,d3599058f8d79be0
内部结构:
1.主要字段和属性: 
1.buckets:这是一个整型数组,用作哈希桶。每个元素都代表一个桶的索引,而桶是用于存放键值对的链表的头节点(即entries中的元素索引)。
2.entries:这是一个 Entry 结构体数组,Entry 结构体包含键、值、哈希码以及指向下一个 Entry 的索引。
3.count:该字段表示 Dictionary 中当前键值对的数量。
4.version:这是版本号,在对 Dictionary 进行修改操作时,版本号会更新,主要用于在迭代期间检测集合是否被修改。
5.freeList:此为空闲列表的头索引,用于管理已删除的 Entry 槽位,方便后续复用。
6.freeCount:该字段表示空闲列表中 Entry 的数量。
7.comparer:这是一个 IEqualityComparer<TKey> 类型的比较器,用于比较键的相等性。
8.keys:这是一个 KeyCollection 类型的对象,用于表示 Dictionary 中的所有键。
9.values:这是一个 ValueCollection 类型的对象,用于表示 Dictionary 中的所有值。
表示当前字典中含有的键值对数量。
注:因为在字典中移除元素时,字典的count并没有改变,count只在freeCount(字典中空闲的数量)为0时,才进行增加的操作,所以在获取字典中有效的键值对数量时,需要用count - freeCount来计算。
2.构造函数:
1.无参构造函数、指定初始容量的构造函数、指定比较器的构造函数、指定初始容量和比较器的构造函数:

最终都调用了指定容量和比较器的构造函数。
1.CoreCLR 平台的特殊处理:
HashHelpers.s_UseRandomizedStringHashing:
作用:标志位,指示是否启用随机化字符串哈希(防御哈希碰撞攻击)。
默认值:在 .NET Core 中通常为 true。
comparer == EqualityComparer<string>.Default:
条件:检测用户是否显式使用了默认的字符串比较器。
替换比较器:
this.comparer = (IEqualityComparer<TKey>) NonRandomizedStringEqualityComparer.Default;
目的:
在启用随机化哈希的平台上,若用户未指定自定义比较器,强制使用非随机化比较器。
兼容性:确保与旧版本 .NET Framework 行为一致,避免因随机化哈希导致的跨版本不一致问题。
2.初始化容量:
如果指定了容量就会调用到Initialize函数,如下:
通过HashHelpers.GetPrime得到一个新的值,作为哈希桶和键值对数组的容量,代码如下:
解释:
1. min|1:确保 i 初始值为大于等于 min 的最小奇数。min | 1 将 min 的最低二进制位强制设为 1。若 min 是偶数,结果为 min + 1;若 min 是奇数,结果不变。
2.IsPrime(i):验证 i 是否为质数。
3.(i - 1) % Hashtable.HashPrime != 0:确保 i - 1 不能被预定义的质数 HashPrime 整除。
作用:
上述代码通常用于哈希表扩容时选择新容量,其设计目标包括:
减少哈希冲突:选择质数作为容量,使哈希分布更均匀。
避免特定冲突模式:通过 (i - 1) % HashPrime != 0 排除某些可能导致冲突的值。
性能优化:跳过偶数和快速终止条件提升搜索效率。
预制的质数表数据如下:
2.指定键值对容器参数的构造函数、指定键值对容器和比较器参数的构造函数:

3. 反序列化构造函数:

此构造函数是 .NET 序列化机制中延迟加载模式的经典实现,确保复杂数据结构(如哈希表)在反序列化时的安全性和正确性。通过暂存 SerializationInfo 并在对象图构建完成后恢复数据,有效解决了依赖项初始化和哈希计算的时序问题。
核心原理
(1) 序列化流程
序列化时:调用 GetObjectData 方法(实现 ISerializable 接口),将字典的键值对、容量、比较器等数据写入 SerializationInfo。
反序列化时:
框架通过反射调用此受保护构造函数,传入 SerializationInfo 和上下文。
不立即还原哈希表,而是将 SerializationInfo 暂存到 HashHelpers.SerializationInfoTable(一个静态字典),等待后续处理。
(2) 延迟加载的原因
依赖项未就绪:反序列化时,字典可能依赖其他尚未反序列化的对象(如自定义比较器)。
哈希码计算安全:某些键的 GetHashCode() 可能在反序列化时抛出异常(例如,键对象未完全初始化)。
(3) 完成反序列化
在对象图完全构造后,框架调用 IDeserializationCallback.OnDeserialization 方法,此时从 HashHelpers.SerializationInfoTable 中取出暂存的数据,重建哈希表的 buckets 和 entries 数组。
动态扩容:
在字典中扩容的调用有两处:
1.字典中的元素已满:会通过一个函数重新找到一个新的容量值。
ExpandPrime代码如下:
2.字典中的哈希冲突的数量已达到阈值:传入新的容量的是entries当前长度,并强制更新hashcode。
扩容的主要方法如下:
主要方法:
1.Add:调用字典中的Insert方法
2.Remove:
3.Insert:
4.Clear:
5.FindEntry:
6.ContainsKey:
7.ContainsValue:
8.TryGetValue:
未完待续。。。
相关文章:
C#容器源码分析 --- Dictionary<TKey,TValue>
Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合,其核心实现基于哈希表和链地址法(Separate Chaining)。 .Net4.8 Dictionary<TKey,TValue>源码地址: dictionary…...
yum的基本操作和vim指令
在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…...
MCU刷写——HEX与S19文件互转详解及Python实现
工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走…...
深入探讨避免MQ消息重复消费的策略与实现
引言 随着微服务架构的流行,消息队列(Message Queue, MQ)作为系统间异步通信的重要手段,被广泛应用于各种场景。然而,在使用MQ的过程中,一个不容忽视的问题是消息可能被重复消费。这不仅可能导致数据不一致…...
定制一款国密浏览器(8):SM3 摘要算法
上一章我们讲到了铜锁和 BoringSSL,本章从最简单的国密算法 SM3 摘要算法入手,说明一下 SM3 算法的移植要点。 SM3 算法本身并不复杂,详细算法说明参考《GB∕T 32905-2016信息安全技术 SM3密码杂凑算法》这份文档。因为铜锁开源项目有实现代码,直接照搬过来。 将 crypto/…...
【Docker基础】Compose 使用手册:场景、文件与命令详解
文章目录 一、什么是 Docker Compose二、为什么需要 Docker Compose三、Docker Compose 使用步骤 / 核心功能步骤核心功能: 四、Docker Compose 的使用场景五、Docker Compose 文件(docker-compose.yml)文件语法版本文件基本结构及常见指令常…...
RT-2论文深度解读:视觉-语言-动作统一模型的机器人泛化革命
1. 核心问题与挑战 传统机器人学习存在两大瓶颈: 数据效率低下:依赖特定场景的机器人操作数据(如抓取、推压),收集成本高泛化能力局限:模型仅能完成训练中出现过的任务,无法应对长尾场景 RT-…...
git 提交标签
Git 提交标签 提交消息格式: <type>: <description> (示例:git commit -m "feat: add user login API") 标签适用场景feat新增功能(Feature)。fix修复 Bug(Bug fix&…...
学习率(Learning Rate)
学习率(Learning Rate)是深度学习中最关键的超参数之一,它控制模型在每次参数更新时的“步长大小”。简单来说:它决定了模型从错误中学习的“速度”。 直观比喻 想象你在山顶蒙眼下山(找最低点)࿱…...
李宏毅NLP-3-语音识别part2-LAS
语音识别part2——LAS Listen Listen主要功能是提取内容信息,去除说话人差异和噪声 。编码器(Encoder)结构,输入是声学特征,经过 Encoder 处理后,输出为高级表示,这些高级表示可用于后续语音识别…...
游戏引擎学习第222天
回顾昨天的过场动画工作 我们正在制作一个游戏,目标是通过直播的方式完成整个游戏的开发。在昨天的工作中,我享受了制作过场动画的过程,所以今天我决定继续制作多个层次的过场动画。 昨天我们已经开始了多层次过场动画的基本制作࿰…...
双系统win11 + ubuntu,如何完全卸载ubuntu系统?
双系统win11 ubuntu,如何完全卸载ubuntu? 注意事项 操作前确保有 Windows 安装介质(USB),以防需要修复对 EFI 分区的操作要格外小心如果使用 BitLocker,可能需要先暂停保护如果遇到问题,可以使用 Windows…...
【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement
code: https://github.com/NJU-PCALab/RAG-Diffusion Abstract 区域提示,或组成生成,能够实现细粒度的空间控制,在实际应用中越来越受到关注。然而,以前的方法要么引入了额外的可训练模块,因此只适用于特定…...
HarmonyOS:Map Kit简介
一、概述 Map Kit(地图服务) 为开发者提供强大而便捷的地图能力,助力全球开发者实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。您可以轻松地在HarmonyOS应用/元服务中集成地图相关的功能,全方位…...
【从零实现高并发内存池】- 项目介绍、原理 及 内存池详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
CSS margin(外边距)学习笔记
CSS 中的 margin 属性用于定义元素周围的空白区域,它是一个非常重要的布局工具,可以帮助我们控制元素之间的间距,从而实现更美观和易用的页面布局。以下是对 margin 属性的详细学习笔记。 一、margin 的基本概念 margin 是元素周围的透明区…...
【数据集】中国各省低空经济及无人机相关数据集(1996-2025年2月)
低空经济泛指3000米高空以下的飞行经济活动,以民用客运飞行器和无人驾驶航空器为主。低空经济产业是先进飞行器出行(AAM)在城市低空运行的一种变革性和颠覆性的复合新产业,主要以垂直起降型飞机(VTOL)与无人…...
C++动态分配内存知识点!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,又是分享干货的时间,今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…...
哈喽打车 小程序 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 这一次遇到这种风控感觉挺有…...
泛型的二三事
泛型(Generics)是Java语言的一个重要特性,它允许在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型安全的代码重用。泛型在Java 5中被引入,极大地增强了代码的灵活性和安全性。…...
云计算:数字浪潮中的第三次文明跃迁——从虚拟化到智能协同的范式革命
一、浪潮的序曲:从机械革命到数字原子的觉醒 20世纪中叶,当晶体管的发明点燃信息革命的火种时,人类社会的第三次浪潮已悄然萌芽。托夫勒预言的“信息将成为新的权力核心”,在21世纪初以云计算的形态具象化。这场浪潮的起点&#…...
redis哨兵机制 和集群有什么区别:
主从: 包括一个master节点 和多个slave节点: master节点负责数据的读写,slave节点负责数据的读取,master节点收到数据变更,会同步到slave节点 去实现数据的同步。通过这样一个架构可以去实现redis的一个读写分离。提升…...
java基础2
构造器: 构造器与类同名; 每个类可以有一个以上的构造器; 构造器可以有0个,1个或多个参数; 构造器没有返回值; 构造器总是伴着new一起调用 方法重载: 方法名字一样,参数不一样…...
《算法笔记》3.6小节——入门模拟->字符串处理
1009 说反话 #include <cstdio>int main() {char sen[80][80];int num0;while(scanf("%s",sen[num])!EOF){num;}for (int i num-1; i > 0; --i) {printf("%s ",sen[i]);}printf("%s\n",sen[0]);return 0; }字符串连接 #include <io…...
JavaScript:BOM编程
今天我要介绍的是JS中有关于BOM编程的知识点内容:BOM编程; 介绍:BOM全名(Browser Object Model(浏览器对象模型))。 是浏览器提供的与浏览器窗口交互的接口,其核心对象是 window。与…...
用户自定义函数(UDF)开发与应用(二)
五、UDF 在不同平台的应用 5.1 数据库中的 UDF 应用(如 MySQL、PostgreSQL) 在数据库领域,UDF 为开发者提供了强大的扩展能力,使得数据库可以完成一些原本内置函数无法实现的复杂操作。 以 MySQL 为例,假设我们有一…...
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...
Tkinter样式与主题定制
在创建图形用户界面(GUI)应用时,除了功能的实现外,界面的外观和用户体验也非常重要。Tkinter提供了多种方式来定制控件的样式,使应用程序界面更加美观和易用。在这一章中,我们将介绍如何使用Tkinter的样式和…...
CSS 背景属性学习笔记
CSS 背景属性用于定义 HTML 元素的背景效果,包括背景颜色、背景图像、图像平铺方式、图像定位以及图像是否固定等。以下是关于 CSS 背景属性的详细学习笔记。 一、背景颜色(background-color) background-color 属性用于定义元素的背景颜色…...
信息安全管理与评估2023广东省样题答案截图视频
2023年广东省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 一、 赛项时间 9:00-13:30,共计4小时30分,含赛题发放、收卷时间。 二、 赛项内容 本次大赛,各位选手需要完成三个阶段的任务,其中第一个阶段需要…...
ubuntu学习day1
linux常用命令 1. 用户相关 1.1 切换用户 su root #切换到root用户 su user #切换到普通用户sudo能赋予普通用户管理者权限,一般不要直接使用root用户进行操作。 1.2 添加用户 useradd 用户名 useradd user1 #添加了用户名为user1的用户但在ubuntu中想要创建普…...
ubuntu22.04-VMware Workstation移动后无法连接网络
1.VMware 中查看NAT模式 2.查看宿主机VMnet8的IP地址 虚拟机里设置成192.168.20.160 , 255.255.255.0, 192.168.20.2 在ubuntu系统中设置如下: 至此可以连上了。...
如何评估大模型的性能?有哪些常用的评估指标?
评估大模型(如大语言模型 LLM)的性能是一个多维度的问题,常常需要结合多个指标从不同角度来考察模型的能力。以下是常见的评估方法和指标: 一、通用评估维度 任务性能(Task Performance) 衡量模型在特定任务上的表现,如问答、翻译、总结等。 语言能力(Linguistic Capa…...
Linux驱动开发-网络设备驱动
Linux驱动开发-网络设备驱动 一,网络设备总体结构1.1 总体架构1.2 NAPI数据处理机制 二,RMII和MDIO2.1 RMII接口2.2 MDIO接口 三,MAC和PHY模块3.1 MAC模块3.2 PHY模块 四,网络模型4.1 网络的OSI和TCP/IP分层模型4.1.1 传输层&…...
CTF web入门之文件包含
web78: include函数执行file引入的文件,如果执行不成功,就高亮显示当前页面的源码。 方法一:filter伪协议 file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/readc…...
error: failed to run custom build command for `yeslogic-fontconfig-sys v6.0.0`
rust使用plotters时遇到编译错误。 一、错误 error: failed to run custom build command for yeslogic-fontconfig-sys v6.0.0 二、解决方法 我用的是opensuse,使用下面命令可以解决问题。 sudo zypper in fontconfig-devel...
低资源需求的大模型训练项目---调研0.5B大语言模型
一、主流0.5B大语言模型及性能对比 1. Qwen系列(阿里) • Qwen2.5-0.5B:阿里2024年9月开源的通义千问系列最小尺寸模型,支持32K上下文长度和8K生成长度。在中文场景下表现优异,指令跟踪、JSON结构化输出能力突出&…...
信息安全管理与评估广东省2023省赛正式赛题
任务1:网络平台搭建(60分) 题号 网络需求 1 根据网络拓扑图所示,按照IP地址参数表,对DCFW的名称、各接口IP地址进行配置。(10分) 2 根据网络拓扑图所示,按照IP地址参数表,对DCRS的名称进…...
LeetCode.225. 用队列实现栈
用队列实现栈 题目解题思路1. push2. pop3. empty CodeQueue.hQueue.cStack.c 题目 225. 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现…...
CTF--bp
一、原题: (1)提示:弱密码top1000?z????? (2)原网页: 二、步骤: 1.先打开BP,随便输入一个密码: 2.打开BP,发现password&#…...
01_背包问题
package org.josh; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 物品数量 long w scanner.nextLong(); // 背包容量,使用long防止溢出 int[] v …...
ps 人像学习
视频: 一ps快捷键 1.1 创建图层 ctrlj 1.2 放大缩小图片的大小 按住alt 滚轮 1.3 移动图片 空格 左键 1.4 撤回 ctrlz 二 精修的第一步是去除斑点,瑕疵, 2.1 污点修复画笔工具 新建一个图层,点击污点修复工具进行修复…...
【AI论文】MM-IFEngine:迈向多模态指令遵循
摘要:指令遵循(IF)能力衡量多模态大语言模型(MLLM)准确理解用户告诉他们的内容以及他们是否做得正确的能力。 现有的多模态指令训练数据很少,基准测试简单,指令原子化,对于要求精确输…...
【C++初学】课后作业汇总复习(五) 单目运算符重载
本题主要考察-构造函数的定义和操作符重载、友元函数等 根据后缀和程序样例输出,完成分数类和相关函数的定义, 输入: -6 12 8 -16 输出: 1/2 1/1 -1/2 / -1/2 - -1/2 0/1 输入: 3 7 2 6 输出: 1/…...
Python基础语法速通(自用笔记)
目录 # 输出直接print就行了 # 次方,除法,取整 # 定义变量直接写就可以,不用写类型 # 基础的while不用写()和{},直接用冒号即可,缩进对齐 # 这里的for循环直接用in就可以,意思是从...中一个…...
Nginx基础讲解
Nginx基础讲解 Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,广泛用于负载均衡、静态资源托管、SSL 终端等场景。以下是对 Nginx 的详细讲解: 1. Nginx 核心概念 事件驱动架构:基于异步非阻塞模型,高效处理高并发连接…...
K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战
系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…...
组件安全工程化革命:从防御体系构建到安全基因重塑
文章目录 总起:数字世界的钢铁长城 分论: 一、组件生态的"七宗罪"与安全基因重组 二、百万级流量下的安全工程化实战 三、性能与安全的共生进化论 四、安全工程化全链路解决方案 总束:安全基因驱动的未来图景 五、时代思考…...
(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载
源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP,…...
发送加密信息的简单实现【Java】
(修改期) 一、代码的引用处 public static SecretKeys generateKeys() throws NoSuchAlgorithmException {: 定义一个公共静态方法,用于生成 AES 和 HMAC 密钥对。 public static String encrypt(String plaintext, SecretKey aesKey, S…...