扫盲,那些让人蛋疼的Hash概念

Zcash - 深入浅出Pedersen Hash/Commitment计算 接触过Zcash的人一定都听说过Pedersen Hash,或者Pedersen Commitment。实际上,在Zcash中存在下面4种不同的概念: 1.Pedersen Hash 2.Mixing Pedersen Hash 3.Windowed Pedersen Commitment 4.Homomorphic Pedersen Commitment 你能分清楚它们直接的区别和联系吗?本文将... 阅读详情

声明:本文首发微信公众号【菜鸟要飞】,如有转载,请标明出处!

今天分享的内容纯粹是概念和基本原理层次上的介绍,也是我在学习HashMap的源码时在一些专业术语上混淆,简单总结一下分享给大家。

Hash算法

概念

 

Hash算法是这样一类算法,这类算法接受任意长度的二进制输入值,对输入值做换算(切碎),最终给出固定长度的二进制输出值。哈希算法是用来解决数据和数据之间对应关系的一种算法。

应用

1、安全方面。加密算法,如MD5算法。

2、快速查找。例如运用一种哈希算法将每张图片映射出唯一的MD5值,实现快速以图搜图的功能。

3、数据结构。具体表现就是哈希算法在哈希表中的应用。说起哈希表这里又要提到另外一个概念——哈希函数,是支撑哈希表的一类函数。通过哈希函数,实现数据映射,使得哈希表实现对数据快速存取的功能。个人认为哈希函数和哈希算法是指的同一个概念。

哈希表

首先哈希表是一种数据结构。常见的数据结构还有数组,链表,树,图等。

概念

元素存储在线性表、树这种数据结构的存储地址是随机的,和元素之间不存在确定关系。因此,在这样的数据结构中查找某个元素时需要进行一系列和元素的比较。数组采用一段连续的存储地址来存储数据,元素和下标之间有对应关系,但如果不知道元素的具体下标,在查找元素时还是要经过一系列的比较。这一类查找方法建立在比较的基础上。最大的缺点就是慢!

哈希表则利用了在数组中根据下标就可以一次定位到某个元素的特性。哈希表在存储地址和元素的关键字之间建立一个确定的关系f

存储地址 = f(关键字);

使的每个元素和数据结构中一个唯一的存储地址相对应。因而在查找时,首先利用元素的关键字和确定关系f找到元素的存储地址,进而一次定位到某个元素,不需要比较便可直接获取。

在此,我们称这个对应关系f为:哈希(Hash)函数,按这个思想建立的映射关系表为:哈希表。

哈希函数

哈希函数,是哈希表的支撑。是哈希表中存储地址和存储元素的关键字之间映射关系的具体实现。这里强调一下,它是一类算法,并不是某一个。

哈希函数常用的实现方法有直接寻址法,数字分析法,平方取中法、随机数法、除留取余法等待,有兴趣的自己查一查。

哈希冲突

哈希冲突是指,在哈希表中当我们对某个元素的关键字经过哈希函数运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,就是所谓的哈希冲突。我们需要清楚的是,哈希表的存储空间是一个数组,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。

冲突只能尽量地少,而不能完全避免。常见的解决哈希冲突的方法:链地址法,再哈希法、开放定址法、公共溢出区。

所以在实现哈希表这种数据结构时,要设定一个好的哈希函数,尽可能地保证计算简单和散列地址分布均匀,尽量减少冲突;还要必须设定一种处理哈希冲突的方法。

个人理解哈希表就是:哈希(Hash)函数+ 数组 + 哈希冲突的处理

HashMap

HashMap是Java JDK提供的一种数据类型,是基于数组来实现哈希表,进行数据的存储。

先看一张HashMap原理实现图

首先要重点说明一下,HashMap中的元素指的是Entry对象,并不是调用HashMap的put方法时传入的value。Entry对象它自身又是个链表,这个对象包含key(关键字)、value、next(链表)、hash(存储地址)四个成员,其中key和value是在调用HashMap的put方法时传入的。

这里要强调一下,HashMap中的哈希函数 ,并不是 key到value的映射。在使用习惯上,很容易让人误解HashMap中哈希表的实现就是 key到value的映射,其实是Entry(元素)、  key (关键字)和数组index(存储地址)之间的映射。

我们可以结合上面哈希表的定义类比一下:

HashMap中的数组相当于元素也就是Entry对象的存储空间,数组的index就像相当于元素的地址,而key相当于元素的关键字。

 

哈希函数 就可抽象为

index = f(key),这里的key 就是平常调用HashMap put方法时传入的参数key。

在HashMap中哈希函数的具体实现就是 

f(key) = key.hashCode() & (table.length - 1);

HashMap中的链表就是用来处理哈希冲突的,也就是上面提到的链地址法。具体实现大家可以查阅资料或源码,这里不做深入探讨。

最后

 

提到HashMap和hashCode()方法,一定就少不了equals方法。重写equals方法时为什么一定要重写hashCode()方法,真的一定要重写吗? 这将是下次分享的内容。

 

欢迎关注我的公众号:【菜鸟要飞】 ,面试宝典、学习路线、源码分享等等你来学

空天大模型详解 空天大模型是指面向空天信息领域(如卫星遥感、导航、气象等)设计的多模态人工智能模型,能够处理海量遥感数据、多传感器信息及跨时空分析任务。多模态融合:整合可见光、雷达、热红外、多光谱等多源遥感数据,构建统一表征空间,例如“空天·灵眸”3.0版支持航空、卫星及无人机数据的自动化解译。轻量化与高效推理:针对星载计算场景,采用分层量化、跨模态蒸馏技术压缩模型参数(如JigonGPT从1.02B压缩至0.23B,性能仅牺牲5.2%)18,并通过热传导架构提升计算速度2.4倍。神经符号结合。 阅读详情

相关推荐

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 777

通俗理解_通俗地理解哈希函数

哈希函数不是指某种特定的函数,而是一类函数,它有各种各样的实现。百度百科给出的定义是:Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。维基百科则直接将哈希函数的词条重定向到散列函数中,定义如下:散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种...

weixin_39662611的博客 1097

Conda换源全攻略:从清华源到默认源的保姆级切换教程(附常见问题解决)

本文提供Conda换源的完整教程,详细讲解如何从清华源切换到默认源,包括配置步骤、常见问题解决方案及高级技巧。针对国内开发者遇到的下载速度慢问题,清华源提供了高速稳定的解决方案,同时文章也介绍了恢复默认源的方法和多种镜像源选择。

weixin_28837817的博客 940

什么是哈希函数?如何设计一个好的哈希函数?

哈希函数(Hash Function),也称为散列函数,是一种将任意长度的数据映射为固定长度的哈希值的函数。它能够将输入数据转换为一串数字或字母组成的固定长度字符串,这个字符串通常作为数据的指纹或摘要。哈希函数在数据结构(如哈希表)和密码学中有广泛应用,其设计的质量直接影响到哈希表的数据分布和性能。:相同的输入必须产生相同的输出。这意味着如果输入数据不变,哈希函数的输出也必须一致。:计算哈希值的速度应较快,以确保在实际应用中能够迅速完成大量的哈希运算。

破损的天堂鸟博客 2359

Innovus每日精要 | 用setScanReorderMode优化扫描链,效率翻倍!

在数字后端物理设计的世界里,扫描链优化就像修路一样,既要保证数据流的顺畅,又要尽量减少绕路和资源浪费。它的主要任务是优化扫描链的连接方式,确保数据能快速、安全地流动。无论是多电压域设计、分区设计,还是复杂的逻辑门,它都能帮你搞定。后,你会发现它不仅能帮你节省时间,还能让你的设计更优雅、更高效。下次遇到扫描链问题时,不妨试试这些技巧,说不定你的设计效率会翻倍!,它能帮你搞定扫描链优化的那些事儿,让你的设计更高效、更优雅。接下来,我们看看这个命令的几个关键选项,以及它们的实际用途。扫描链优化看似枯燥,但掌握。

weixin_50820814的博客 1442

NVIDIA驱动装好了,Gazebo为啥还是卡?手把手教你用optirun搞定GPU加速

本文详细解析了NVIDIA驱动安装后Gazebo仍卡顿的原因,并提供三步精准诊断与GPU加速实战方案。通过optirun快速启用GPU加速,解决OpenGL与显示服务器的配置问题,显著提升仿真性能。适用于ROS、PX4等开发环境,帮助用户充分利用显卡性能。

weixin_30379531的博客 465

哈希函数学习笔记

哈希函数(Hash Function)是一公开函数,用于将任意长的消息M映射为较短的、固定长 度的一个值H(M),又称为散列函数、杂凑函数.我们称函数值H(M)为哈希值、杂凑值、杂凑码、 或消息摘要。杂凑值是消息中所有比特的函数,因此提供错误检测能力。消息中任何一个比特或者几个比特的改变都会造成杂凑值的改变。总结:密码学上安全的哈希函数H应该包含的性质:①对于任意的消息x,计算H(x)是容易的。②H是单向的③H是强抗碰撞的对于给定的哈希值h,试图找到满足H(x)=h的x。对于m位的哈希值,穷举的规模大约是2

qq_54223524的博客 9967

window系统 dlib库安装

1. 安装visual studio 1.1. 安装vs2017或以上版本 1.2. 我们需要安装使用C++的桌面开发,且必须选上用于Cmake的Visual C++工具 1.3. 安装完成后,将D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin 添加到环境变量PATH中 2 下载cmake文件,并添加环境变量 2.1 在c

@bangbang的博客 815

一文读懂哈希函数

哈希函数 哈希函数(Hash):h=H(Data) ##定义 哈希函数H,将可变大小的数据Data作为输入,产生固定长度的h值。 密码学哈希函数,是一个数学函数。哈希函数本身拥有的特征: 1、输入任意性:函数的输入可以是任意大小的数据; 2、输出固定性:函数的输出是一个固定大小的数据; 3、能够进行有效计算:也就是说在一个合理的时间内,能够对输入数据进行运算得出输出。 对于区块链技术以及加密数字货...

BitTribeLab的博客 9624

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文深入剖析了RTL8306MB交换芯片驱动开发中RMII接口的典型调试陷阱。通过一个工业网关项目的实战案例,揭示了因硬件原理图设计疏忽导致TX_EN与CRS_DV信号线错接,从而引发网络“哑火”的根本原因。文章详细展示了使用示波器从时钟、数据到控制信号的系统性排查方法,并总结了关键的设计警示与自查清单,为嵌入式网络开发中的软硬件协同调试提供了宝贵经验。

qqq44的博客 1029

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

哈希算法讲解

哈希是密码学的基础,理解哈希是理解数字签名和加密通信等技术的必要前提。 一. 基本含义: 哈希,英文是 hash ,本来意思是”切碎并搅拌“,有一种食物就叫 Hash ,就是把食材切碎并搅拌一下做成的。哈希函数的运算结果就是哈希值,通常简称为哈希。哈希函数有时候也翻译做散列函数。 根据维基百科的定义,哈希函数要做的事情是给一个任意大小的数据生成出一个固定长度的数据,作为它的映射。所谓映射就是......

EmotionComputer 2296

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 652

分库分表“实践”大全

分库分表是个蛋疼的过程,需要考虑数据迁移、数据同步、数据切分等多个工作项,项目bug会持续到天荒地老。网络上搜索到的文章,往往有些错误的观点,只有调研,没有实践。在早些年,我就走过这方面的弯路。本篇文章亦为实践后的产出,有很大的参考价值背景前不久发过两篇关于分表的文章:从标题可以看得出来,当时我们只做了分表;还是由于业务发展,截止到现在也做了分库,目前看来都还比较顺利,所以借着脑子还记得清楚来一次...

小姐姐味道 757

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

一篇读懂哈希函数:原理、特性、应用与常见算法

哈希函数是将任意长度数据映射为固定长度值的函数,具有定长输出、单向性、雪崩效应、抗碰撞和高效计算五大特性。它广泛应用于数据校验、密码存储、哈希表、分布式系统和数字签名等领域。常见算法包括MD5(不安全)、SHA-1(废弃)和更安全的SHA-256/SHA-512。哈希碰撞虽必然存在,但好的哈希函数使其计算上不可行。作为计算机科学的基础组件,哈希函数在数据结构、安全体系和分布式系统中发挥着关键作用,为数据生成不可逆且唯一的"数字指纹"。

编程改变世界。想做一些改变世界的产品。感谢一键三连。 2427

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

全面理解哈希函数及其应用

1. 哈希函数 哈希函数是指一种能够讲任意数据转换为固定长度编码的一种函数,因为不同数据得到的哈希值可能相同,因此哈希过程一般是不可逆的,哈希函数可以应用的密码加密,哈希存储等方面。 好的哈西函数应该具备以下特点: 相同的数据得到的哈希值唯一 通过哈希值无法通过反向推导得到源数据 源数据发生微小改变,得到的哈希值完全不同, 长的字符也能快速的计算出哈希值 要尽量避免冲突(不同的数据得到的编码要尽量不同) 2. 哈希加密算法 比如对用户密码的加密,如果使用明文来存储用户密码,那么管理员很容易就能在后台获取

lch551218的博客 8619

哈希函数(Hash Function)

哈希函数 Hash Function

my_lamado的博客 2427

一文了解Hash

把数据通过一定的Hash算法处理后,映射到环上。将三个服务器通过hash散列到环形空间。将机器信息通过hash算法映射到环上。数据通过顺时针旋转,找到对应的服务器。

优快云博客技术,java高级工程师,业务层架构师,高级管理认证,毕业设计可以联系我 1415

什么是哈希函数

Hash函数译为哈希函数,又称散列函数。是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出的值称为散列值或消息摘要。简单来说就是一种将任意长度的输入消息压缩成某一固定长度的消息摘要的函数。 它具备以下的性质(哈希函数所必须的性质): H可应用于任意大小的数据块。 H产生定长的输出。 对任意给定的x,计算H(x)比较容易,用硬件和软件均可以实现。 出于安全性考虑,对哈希函数的三个安全性假设: 对任意给定的散列值h,找到满足H(x)=h的x在计算上是不可行的,称之为单向性...

zhuzitop的博客 1万+

哈希介绍、哈希表模拟实现

哈希介绍、哈希表模拟实现

2302_76314368的博客 1940

哈希算法:数字世界的指纹生成器与守护者

哈希算法的安全强度始终遵循"魔高一尺,道高一丈"的进化法则。优先选用标准化算法(如SHA-256)密码存储必须使用盐值+迭代哈希分布式场景需考虑哈希环的平衡性关注最新密码学研究成果随着量子计算时代的临近,基于格的哈希函数和量子抗性算法将成为新的研究热点。理解哈希算法的数学本质与工程实践,是每个程序员构建安全高效系统的必修课。

2501_91058450的博客 1141

区块链入门第一课:理解区块链的基本概念

先看一段视频,初步了解区块链的概念(注意:本文章以比特币系统为例子,比特币系统≠区块链,而是区块链包含比特币系统)区块链概念入门视频区块链是一种分布式、去中心化的数字账本技术,通过加密和共识机制确保数据不可篡改、可追溯。

GreenHands495的博客 1660

【密码学】哈希函数与加密算法的关系

一、哈希函数的定义;二、哈希函数的功能;三、哈希函数满足条件及安全性定义;四、哈希函数与加密算法的关联

qq_39780701的博客 1876

什么是Pedersen Hash?

PedersenHash被用于ZCash sapling版本的Pedersen commitment和incremental Merkle tree中,是一种对fixed input length 抗撞击的hash函数,但是对variable-length inputs是not collision-resistant的。 The Pederson hash function Pederson(D,...

mutourend2010@gmail.com 1603
上一篇: 建议你用Git命令完成这次闯关游戏。
下一篇: 你好,我是一个不用你写一行代码的爬虫。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值