社区
C# 帖子详情 哈希算法会占用大量的内存吗? CsToD 2009-08-26 05:37:45 GetHashCode()得到的是一个32位的整数
难道要分配这么多个存储桶?
...全文
603 19 打赏 收藏 哈希算法会占用大量的内存吗? GetHashCode()得到的是一个32位的整数 难道要分配这么多个存储桶? 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 19 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 mbh0210 2009-08-27 打赏举报 回复 Hashtable里的元素很少(例如只有几个),存储桶不会太多, stning 2009-08-27 打赏举报 回复 ok,我的理解能力有问题,得了。 CsToD 2009-08-27 打赏举报 回复 我看了一下源码,大概知道怎么回事了。
“兄弟,你是怎么理解的,为什么存储桶要2的32次方这么多”
>>这是你自己的理解能力有问题
你既然说如果两个元素的Hash代码不同,它们就存在于不同的存储桶,而每个元素的Hash代码是32位整数,也就是有2的32次方种可能,那要能唯一识别不能的元素,必然至少需要2的32次方个桶。这就像汉字超过了256个,要使得每个汉字的编码不同,一个字节就不够用,所以要用两个或更多。这是很简单的道理。
根据我刚才对源码的初步分析,的确没那么多桶,但前提是Hash代码不同的元素,是可能存在于相同的桶的
private uint InitHash(object key, int hashsize, out uint seed, out uint incr)
{
uint num = (uint) (this.GetHash(key) & 0x7fffffff);
seed = num;
incr = 1 + ((uint) (((seed >> 5) + 1) % (hashsize - 1)));
return num;
}
其中GetHash的实现为:
protected virtual int GetHash(object key)
{
if (this._keycomparer != null)
{
return this._keycomparer.GetHashCode(key);
}
return key.GetHashCode();
}
也就是说:Hash代码并非是桶的代号,而只是用于计算桶的代号
所以桶的数量我可以自定,比如我设为7,那么我可以把7,14,21放置于0号桶,把8,15,22放于1号桶,
所以如果有3个元素,它们的Hash代码分别是8,15,22的话,虽然各不相同,但是都被放于1号桶。
但是你居然认为既要让不同Hash代码的元素放于不同的桶,又要求桶的数目小于Hash可能的取值范围,你也把计算机看得太神秘了吧?
stning 2009-08-27 打赏举报 回复 [Quote=引用 14 楼 cstod 的回复:]
GetHashCode返回的是一个32位整数
如果存储桶没有2的32次方这么多,怎么能保证Hash代码不同的元素存在于不同的存储桶?
[/Quote]兄弟,你是怎么理解的,为什么存储桶要2的32次方这么多 z050301402 2009-08-27 打赏举报 回复 学习 CsToD 2009-08-27 打赏举报 回复 GetHashCode返回的是一个32位整数
如果存储桶没有2的32次方这么多,怎么能保证Hash代码不同的元素存在于不同的存储桶? fengqieer1986 2009-08-27 打赏举报 回复 学习学习 stning 2009-08-27 打赏举报 回复 那如果两个元素的HashCode不同,也可能存在同一个存储桶中?
[Quote=引用 1 楼 stning 的回复:]
每一存储桶都与一个哈希代码关联
[/Quote]怎么可能。。。 CsToD 2009-08-27 打赏举报 回复 你的意思是存储桶的数目并不是uint.MaxValue+1?
那如果两个元素的HashCode不同,也可能存在同一个存储桶中?
stning 2009-08-27 打赏举报 回复 [Quote=引用 7 楼 cstod 的回复:]
我的意思是,即使 Dictionary
[/Quote]囧。。。你看msdn了吗?
当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。 stning 2009-08-27 打赏举报 回复 [Quote=引用 7 楼 cstod 的回复:]
我的意思是,即使 Dictionary
[/Quote]囧。。。你看msdn了吗?
当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。 天火 2009-08-27 打赏举报 回复 学习 CsToD 2009-08-27 打赏举报 回复 我的意思是,即使 Dictionary
摘自
1. 什么是哈希算法?
定义
将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
如何设计一个优秀的哈希算法?
1)单向哈希:
从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。
2)篡改无效:
对输入敏... 算法:哈希算法的应用场景 什么是哈希算法
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
一个优秀的哈希算法应该满足下面几个条件:
从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
以MD5为例解释上面条件:
哈希算法的介绍和实现 百科中,从哈希算法的功能上,对哈希算法进行了定义。百科是这样定义哈希算法的:哈希算法可以将任意长度的二进制值映射为较短的,固定长度的二进制值。我们把这个二进制值成为哈希值。在Java中,哈希(Hash)是一个广泛应用于数据结构和算法中的概念,主要用于快速查找、存储和比较数据。哈希的核心在于哈希函数(Hash Function),它将输入(通常称为键,key)映射到一个固定范围的输出值,这个输出值称为哈希值(Hash Value)或哈希码(HashCode)。 哈希算法 对于哈希算法,在我们平时的开发中,都是基本上拿来就用就行了,所以这节我们将重点放在如何使用,并不进行哈希算法的原理剖析和如何设计一个哈希算法的讲解.
什么是哈希算法?
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值(散列值).一个优秀的哈希算法需要满足:
从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)... 如何选择合适的哈希算法以确保数据安全? 然而,市面上哈希算法种类繁多,从经典的 MD5、SHA - 1 到先进的 SHA - 2、SHA - 3 家族,再到新兴的 BLAKE2、Argon2 等,如何在这众多选项中挑选出契合需求、保障数据安全的哈希算法,成为了开发者、安全从业者乃至普通用户都需要面对的重要课题。而对于一些对性能要求极高的场景,如网络游戏中的数据校验,可能会选择一些轻量级的哈希算法,尽管其安全性略逊一筹,但能在短时间内处理大量数据,保证游戏的流畅运行。我们下载完成后,使用相同的哈希算法计算文件的哈希值,并与提供的哈希值进行比对。
C#
111,093
社区成员
642,554
社区内容
发帖 与我相关 我的任务 C# .NET技术 C# 复制链接
扫一扫 分享 确定 社区描述 .NET技术 C# 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章