当前位置: 首页 > 知识库问答 >
问题:

Java HashMap密钥哈希[重复]

柴琦
2023-03-14

如果我在hashmap中输入一个键和值,并且基于键hashcode生成的索引大于15,并且映射大小仍然小于阈值(即12),会发生什么?

提前谢谢。

共有2个答案

宿文栋
2023-03-14

让我给你们一个更广阔的图景,而不是只关注Java的特定数据类型HashMap,因为你们的问题包括hashcode标签,在我看来,你们对更一般的图景感兴趣——哈希函数是如何工作的。

这是你需要了解的。

通常,索引规范化的实现方式完全取决于对键的输入进行哈希处理的特定数据结构的实现(如HashTable/HashMap),无论是什么实现,都可以肯定地说:

哈希函数h(x)应该负责始终一致地生成一个整数,该整数位于支持数组的有效索引范围内。

在许多实现中,哈希函数可能会返回相当长(可能是负数)的整数,而这通常是通过索引规范化来解决的,索引规范化只会对长整数进行处理(裁剪、使负数为正等)。

对于Java的HashMap实现,hashCode()是:

@HotSpotIntrinsicCandidate
public native int hashCode();

这意味着,该实现被委托给底层。

但是在大多数情况下,您可以假设,它将使用支持数组长度的模(桶的数量),这意味着,它永远不会超过该数组的长度(因此,您的hashmap的大小)。

侯和惬
2023-03-14

HashMap通常会对hashCode()方法提供的值执行模数运算,以便将整数的全部范围映射到其内部数组上的有效索引范围上。

这可能会导致冲突(不同的哈希值映射到同一个索引),这是一个单独的主题,并且还会导致哈希映射的O(1)预期时间降低。需要注意的一点是,假设hashCode()实现是统一的分布。

在一个好的HashMap API中,您不需要担心内部数组大小或冲突。这是由实现以各种方式在内部处理的。

Java的HashMap API中没有公开可见的“阈值”。你能得到的最接近的结果是:

HashMap(int initialCapacity, float loadFactor)

这里,您提到的阈值相当于加载因子。根据Java文档:

“作为一般规则,默认加载因子(.75)在时间和空间成本之间提供了一个很好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)。在设置初始容量时,应考虑地图中的预期条目数及其负载系数,以尽量减少再灰化操作次数。如果初始容量大于最大入口数除以负载系数,则不会发生再灰化操作。"

基本上这意味着,如果HashMap中有太多冲突,它将扩展其当前数组大小并重新散列所有当前密钥,从而(希望)得到更均匀的分布。这样做的效果是,通过从HashMap中添加或删除一系列内容,可以保持预期的O(1)复杂性。

 类似资料:
  • 我已经完成了一个android应用程序的开发,该应用程序使用facebook sdk与facebook集成。目前,我对这个应用程序没有任何问题需要解决,因为它功能齐全,运行良好——但尽管如此,我相信即使应用程序正在运行,我仍然不完全理解Android密钥散列是什么 1)据我所知,facebook sdk为开发者提供了一个独特的应用程序id,以了解他们与谁“交谈”,这样他们也可以控制谁是谁之类的人,

  • 我无法让我的应用程序允许脸谱网登录。每次用户试图登录脸谱网并用他们的FB验证我的应用程序时,都会给我这个错误: 无效的密钥散列。它们的密钥散列xxxxxxxxxx=不匹配任何存储的密钥散列。在http://developers.facebook.com/apps/xxxxxxxx配置你的应用密钥散列 我已经尝试过通过OpenSSL工具创建一个新的密钥哈希,如下所示: 这样做会给我一个密钥哈希,然后

  • 我按照步骤创建哈希键。 > 下载的openssl 解压缩并复制bin文件夹中的所有文件,包括openssl.exe 然后我在OpenSSL.exe终端窗口上使用了以下命令 keytool-exportcert-alias androiddebugkey-keystore c:\users\joelle.android\debug.keystore openssl sha1-binary opens

  • 我知道它很古老,有很多类似的问题。我已经看到了不同的答案,但问题仍然出现在我的申请中。 我正在应用程序中的Facebook登录工作。在上传到谷歌播放之前,它在本地运行良好。但是在谷歌播放上发布后,它会给出无效密钥哈希的错误。 我已经使用下面给出的代码在Android Studio上生成了一个密钥哈希,并将其保存在Facebook开发者控制台上。在Facebook开发者控制台中,我也将应用程序上错误

  • keytool-exportcert-alias diego-keystore“c:\users\diego\desktop\celuchat.keystore”“c:\openssl\bin\openssl.exe”sha1-binary“c:\openssl\bin\openssl.exe”base64 celuchat.keystore是我在导出签名的应用程序时使用的密钥库,当keytool

  • 问题内容: 我完全不了解这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。尽管我不断收到错误,但openssl无法识别为内部或外部命令。问题是,即使我可以解决这个问题,我该怎么办?之后怎么办? 问题答案: 这是你需要做的 从代码 提取中下载openSSl 。在C:/中创建一个文件夹-OpenSSL,然后在此处复制提取的代码。 检测debug.keystore文件路径。如果找不