哈希算法会占用大量的内存吗?

哈希算法会占用大量的内存吗?

社区

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 或者Hashtable里的元素很少(例如只有几个),也会占用大量内存吗?因为存储桶很多啊

[/Quote]囧。。。你看msdn了吗?

当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。 stning 2009-08-27 打赏举报 回复 [Quote=引用 7 楼 cstod 的回复:]

我的意思是,即使 Dictionary 或者Hashtable里的元素很少(例如只有几个),也会占用大量内存吗?因为存储桶很多啊

[/Quote]囧。。。你看msdn了吗?

当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。 天火 2009-08-27 打赏举报 回复 学习 CsToD 2009-08-27 打赏举报 回复 我的意思是,即使 Dictionary或者Hashtable里的元素很少(例如只有几个),也会占用大量内存吗?因为存储桶很多啊 wu14245670 2009-08-26 打赏举报 回复 占啊肯定占 vwxyzh 2009-08-26 打赏举报 回复 HashTable是把(HashCode & int.MaxValue(保证是个正数))% 某一个质数 lyphoon 2009-08-26 打赏举报 回复 Hashtable 的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0 通常提供速度和大小之间的最佳平衡。当创建 Hashtable 时,也可以指定其他加载因子。

摘自 Forrest23 2009-08-26 打赏举报 回复 不懂,帮顶 stning 2009-08-26 打赏举报 回复 每一存储桶都与一个哈希代码关联 【18】哈希算法 18 哈希算法1. 什么是哈希算法?2. 哈希算法的常见应用有哪些?3. 思考4. 参考资料5. 声明

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写文章

相关推荐

[游戏必备插件]FM2024 全球球场改进补丁(12.1更新)
365网站世界杯怎么进

[游戏必备插件]FM2024 全球球场改进补丁(12.1更新)

⌛ 07-01 👁️ 1176
facebook审核包含哪些内容?注册需要审核多久?
365网站世界杯怎么进

facebook审核包含哪些内容?注册需要审核多久?

⌛ 07-04 👁️ 8580
网易邮箱服务器上保存邮件的时间规则是什么?