假设我需要在Hashset中存储1000个对象,最好是让1000个包含每个对象的存储桶(通过为每个对象生成哈希码的唯一值)还是让10个存储桶大致包含100个对象?
具有唯一存储桶的一个优点是,我可以节省调用equals()方法的执行周期?
为什么一定要设置数量的桶并尽可能均匀地分布在它们之间的物体很重要?
理想的物斗比应该是多少?
为什么一定要设置数量的桶并尽可能均匀地分布在它们之间的物体很重要?
A
HashSet
应该能够平均确定O(1)时间的成员资格。从文档中:
该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。
Hashhtml" target="_blank">set
用于实现此目标的算法是检索对象的哈希码,并使用此算法找到正确的存储桶。然后,对存储桶中的所有项目进行迭代,直到找到相等的项目为止。如果存储桶中的项目数大于O(1),则查找将花费比O(1)时间更长的时间。
在最坏的情况下-如果所有项目都散列到同一个存储桶-则需要O(n)时间来确定对象是否在集合中。
理想的物斗比应该是多少?
这里有一个时空权衡。增加铲斗数量会减少发生碰撞的机会。但是,这也增加了内存需求。该哈希集合有两个参数initialCapacity
,并loadFactor
允许您调整多少桶HashSet
应该创建。默认的负载系数是0.75,在大多数情况下都可以使用,但是如果您有特殊要求,则可以选择另一个值。
有关这些参数的更多信息,请参见以下文档HashMap
:
假设哈希函数将元素正确分散在存储桶中,则此实现为基本操作(获取和放置)提供恒定时间的性能。集合视图上的迭代所需的时间与HashMap实例的“容量”(存储桶数)及其大小(键-值映射数)成正比。因此,如果迭代性能很重要,则不要将初始容量设置得过高(或负载因子过低),这一点非常重要。
HashMap的实例具有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中存储桶的数量,初始容量只是创建哈希表时的容量。负载因子是散列表的容量自动增加之前允许其填充的完整程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,通过调用rehash方法,容量大约增加了一倍。
通常,默认负载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(在HashMap类的大多数操作中都得到体现,包括get和put)。设置其初始容量时,应考虑映射中的预期条目数及其负载因子,以最大程度地减少重新哈希操作的次数。如果初始容量大于最大条目数除以负载因子,则将不会进行任何哈希操作。
问题内容: 最近,在一次采访中有人问我,哈希图中的存储桶到底是什么?是数组还是arraylist还是什么? 我很困惑。我知道哈希表由数组支持。那么我可以说存储桶是一个在开始存储哈希码时容量为16的数组,并且链表具有其起始指针吗? 我知道哈希图在内部是如何工作的,只是想知道就数据结构而言,存储桶到底是什么。 问题答案: 不,存储桶是您要引用的数组中的每个元素。在早期的Java版本中,每个存储桶都包含
问题内容: 我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个测试用例。从Redis中提取打包数据并对其进行解压缩时,哈希会略有损坏。当哈希值超出一定长度时,似乎会发生这种情况,尽管我不能肯定地说。 我正在使用Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2。使用节点也会发生相同的问
问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。
我一直在研究散列/加密密码并将其存储在数据库中的正确方法。我知道盐和散列,所以我环顾四周,PBKDF2似乎是一个不错的选择。所以我找到了这个网站,它提供了一个很好的教程,以及一个适用于PHP的PBKDF2(这是我在我的网站上使用的)。 因此,我设置了我的网站,以使用这些功能生成/创建密码,但正如您在以下代码中看到的: salt在create_散列函数中生成,并存储在生成的散列中,该散列最终看起来像
问题内容: 我有一个简单的问题,当我想将SHA1哈希的结果存储在MySQL数据库中时发生: 我将散列结果存储在 VARCHAR 字段中多长时间? 问题答案: 我将使用可变长度的数据,但不使用固定长度的数据。由于SHA-1值 始终为 160位长,因此将仅在固定长度字段的长度上浪费一个额外的字节。 而且我也不会存储返回的值。因为每个字符只使用4位,因此需要160/4 = 40个字符。但是,如果每个字符
2(名)-约翰 3(型号)-客车 4(attr_hash)-由java哈希代码计算