为什么Java的hashCode不支持通用哈希?

2024-03-30

一些哈希表方案,例如布谷鸟哈希 http://en.wikipedia.org/wiki/Cuckoo_hashing or 动态完美哈希 http://en.wikipedia.org/wiki/Dynamic_perfect_hashing,依赖于存在通用哈希函数 http://en.wikipedia.org/wiki/Universal_hash_function以及通过从通用哈希函数系列中选择新的哈希函数来获取存在冲突的数据集合并解决这些冲突的能力。

不久前,我试图用 Java 实现一个由布谷鸟哈希支持的哈希表,但遇到了麻烦,因为虽然所有 Java 对象都有一个hashCode函数,值hashCode每个对象的返回值都是固定的(当然,除非对象发生变化)。这意味着,如果用户不提供外部通用哈希函数系列,就不可能构建依赖于通用哈希的哈希表。

最初我认为我可以通过将通用哈希函数应用于对象的来解决这个问题hashCode直接,但这不起作用,因为如果两个对象具有相同的hashCode, then any您应用于这些哈希码的确定性函数,即使是随机选择的哈希函数,也会产生相同的值,从而导致冲突。

看起来这对 Java 的设计是有害的。代表着HashMap和其他哈希容器完全禁止使用基于通用哈希的表,即使语言设计者可能认为此类表适合语言设计。这也使得第三方库设计者更难构建这种类型的哈希表。

我的问题是:Java 选择这样设计有什么原因吗?hashCode不考虑使用多个哈希函数对对象进行哈希处理的可能性?我知道许多好的哈希方案(例如链式哈希或二次探测)不需要它,但似乎这个决定使得在 Java 对象上使用某些类算法变得困难。


简单。 Java 允许类设计者提供自己的hashCode,正如您提到的,这对于“普通”哈希表来说已经足够好了,并且可以是有够难 https://stackoverflow.com/questions/5110376/hashset-contains-problem-with-custom-objects/5110405#5110405去理解。

此外,当设计 Java Collections API 时,在标准库中拥有通用哈希表就已经是一个足够大胆的举动了。 C 从来没有拥有过它们。 C++ 在 STL 中将它们作为hash_set and hash_map,但那些并没有纳入标准。直到现在,在 C++0x 中,哈希表才再次被考虑标准化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Java的hashCode不支持通用哈希? 的相关文章

随机推荐

  • header/impl 关键字在 kotlin 中的含义是什么?

    就在不久前 当我探索 Kotlin github 存储库时 我发现了一些有趣的事情 Kotlin 现在似乎有一个 header 关键字 收藏H kt https github com JetBrains kotlin blob be95f6
  • string.Empty 与 "" - 这有变化吗?

    根据这个答案 https stackoverflow com a 2905422 386869 and string Empty略有不同 因为 创建一个对象 而string Empty才不是 该答案在该问题上得票最多 然而 这个答案 htt
  • 在实体框架的 where 子句中使用列表

    我正在尝试通过一对多表检索文档 ID 我想在 where 子句中使用列表来查找与列表中每个元素相关的所有 id List
  • Magento group by 日期字段上的子句

    我需要获取指定月份一天内 grand total 的订单总数 SUM MIN MAX 和 AVG 这就是我正在做的事情 collection gt getSelect gt columns SUM base grand total AS t
  • Kotlin - StateFlow 不向其收集器发出更新

    我的应用程序中有一个 UserStateModel 数据类 类型的 StateFlow private val userStateFlow MutableStateFlow
  • TextView 作为带有文本颜色操作的进度条?

    我正在努力改进我的应用程序的用户界面 在我使用的设计中 我有一个 TextView 它将在特定时间充当进度条 ruslt 应该看起来像这样 问题是 随着进度的变化 部分文本的颜色也会改变 我研究了android中的spannablestri
  • ASP.NET Web API 中是否有等效的@JsonView

    我在 Spring 和 Java 方面有更多的经验 但现在我正在从事 ASP NET Web API 项目 因此 在 Spring 中 我可以使用 JsonView 注释来注释我的 DTO 这样我就可以选择通过 REST 显示哪些数据 我发
  • 如何在 web.config 文件中存储字典对象?

    我想在我的网络配置文件中存储一个简单的键 值字符串字典 Visual Studio 可以轻松存储字符串集合 请参阅下面的示例 但我不确定如何使用字典集合来存储字符串集合
  • Cocoa-Touch:如何查看两个 NSDate 是否在同一天?

    我需要知道两个 NSDate 实例是否都来自同一天 有没有比获取 NSDateComponents 并比较日 月 年更简单 更好的方法 如果您的目标是iOS 8 和 OS X 10 9 或更高版本 then 乔的回答 https stack
  • libQt5XcbQpa.so.5:未定义的符号:FT_Property_Set

    当我尝试从 python 脚本运行 wkhtmltopdf 命令时出现此错误 usr bin wkhtmltopdf symbol lookup error usr lib x86 64 linux gnu libQt5XcbQpa so
  • 嵌套视图中的拥抱和压缩阻力

    我试图了解拥抱和抗压阻力是如何真正发挥作用的 我有这样的场景 我需要左侧两个标签 绿色容器内 和右侧两个标签 蓝色容器内 如图所示 我希望绿色容器能够容纳内容 Android 的wrap content 和蓝色容器来填充剩余空间 Andro
  • PostgreSQL 中的跨数据库查询[重复]

    这个问题在这里已经有答案了 我正在尝试在 Postgres 中构建查询 我的背景是 SQL Server 因此我遇到了一些语法挑战 我的查询需要访问两个独立服务器上的两个独立数据库 我需要在数据集之间进行连接 本质上 我在 db1 中有一个
  • pySerial 与 python 2.7 和 3.4 的差异

    我正在开发一个项目 需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno 作为一个简单的测试 我只想通过发送 2 来打开 LED 并通过从命令提示符发送 4 来关闭 LED 尽管我希望最终能够将
  • ScrollView 只能承载一个直接子异常

    我想将图像添加到滚动视图 我尝试使用以下代码 ScrollView sv ScrollView findViewById R id scrollView2 ImageView iv new ImageView this iv setImag
  • Android Studio - Flutter 插件未安装;这增加了 Flutter 特定的功能

    考虑到我已经遵循了所有这些步骤https flutter dev docs get started install linux https flutter dev docs get started install linux在我的 Ubun
  • 使用空格键启动和停止 Python 海龟

    我正在尝试编写一个程序 通过按空格键来启动和停止乌龟 我得到了启动乌龟移动的代码 但当我再次按下它时它并没有停止 看来只是提高速度而已 这是我的编码要求和我输入的代码 创建一个包含三个函数的乌龟程序来控制乌龟 创建一个名为 turnLeft
  • Twitter Bootstrap Carousel 的表达式引擎频道条目无法正常工作

    好的 我在通过 ExpressionEngine 的频道条目实现基本的 Twitter 引导轮播时遇到问题 我认为这与以下事实有关 您必须将第一个 li 标记指定为 活动 以便引导程序知道页面加载时显示哪个图像 但我的代码如下 div cl
  • Java的for循环有没有针对线程安全的优化?

    我有一段代码可以更改两个线程中的计数器 它不是线程安全的 因为我没有在代码中放置任何原子变量或锁 如果代码只运行一次 它会给出正确的结果 但我想运行它多次 所以我将代码放入 for 循环中 问题是只有第一个或前两个循环才会生成我期望的结果
  • Play 2.0 - 服务器重新启动后作为 Windows 服务启动

    我有游戏 作为 Windows 服务运行的应用程序 它是根据this http naoki sato name lab archives 263指导 问题是RUNNING PID当服务器重新启动时 应用程序根文件夹中的内容不会被删除 并且应
  • 为什么Java的hashCode不支持通用哈希?

    一些哈希表方案 例如布谷鸟哈希 http en wikipedia org wiki Cuckoo hashing or 动态完美哈希 http en wikipedia org wiki Dynamic perfect hashing 依