gpt4 book ai didi

java - Scala murmur 哈希与 Java 原生哈希

转载 作者:行者123 更新时间:2023-12-02 14:06:06 28 4
gpt4 key购买 nike

我正在学习 scala,对案例类的哈希代码部分有点困惑。

据我所知,案例类提供了自动生成 toString、equals 和 hashCode 的功能。

在 Java 中,传统观点是 Java 哈希码使用 native 实现。

但在 scala 中它使用 murmur hash

我的问题。

1) Java 具有 native 哈希码,因为哈希码与机器相关,但如果 scala 使用 murmur 哈希,那么它如何与机器无关?

2)Scala 有常规类和案例类,普通类也使用 murmur hash 吗?

3) 如果 murmur hash 确实是第 1 点之后最快的实现,那么为什么 java 仍然使用 native 实现?

最佳答案

MurmurHash 是一种快速的高质量哈希。 Scala 为其集合、元组、案例类和大多数其他库提供的对象(以及 equals)提供自动 hashCode,并且由于其中许多内容都在 HashMap 中使用,因此拥有合适的默认哈希非常重要。 MurmurHash 提供了这一点。据我所知,Java 哈希值也不依赖于机器,即使在某些情况下它们是用 native 代码实现的。重要的是,机器之间的算法是相同的,Scala 的算法是因为它完全用字节码实现,而 Java 的算法是因为任何不在字节码中的东西(我没有检查所有内容!)大概都是经过仔细完成的。

(至少对于任何扩展 java.util.AbstractList 的东西,传统观点是错误的。它根本不是 native 实现,只是迭代器上的一个循环,调用内部每个东西的 hashCode 方法。但是 JVM 擅长这种循环和数学;为什么你希望它是原生的?)

Scala 中的普通类不会覆盖 hashCode所以他们不使用 MurmurHash。然而,大多数不是案例类的库类都使用 MurmurHash——例如,所有有序集合都使用 MurmurHash。 (在顺序无关紧要的集合上使用 MurmurHash 是不合适的,它是依赖于顺序的。)

MurmurHash 尽管速度非常快,但并不是最快的哈希值。 Java 通常使用 x(n)*31 + x(n+1) - 类型的散列算法,速度更快。不幸的是,它也是一个非常糟糕的哈希值。非常容易发生碰撞。此外,MurmurHash 在低开销和快速速度之间取得了很好的折衷,但其他哈希(例如 XxHash 或 CityHash)对于大型对象来说可能更快,但代价是启动开销稍多一些。因此,并不是每个人都应该使用 MurmurHash 来完成所有事情。

尽管如此,Scala 之所以选择 MurmurHash,是因为在更简单的典型 Java 风格哈希中测量到了缺陷,而且它总体上运行良好。为什么Java没有采用它?可能只是因为 Java 作为一种更成熟的语言,往往比 Scala 变化得慢,而且还没有人抽出时间来使用它,和/或任何关心它的人已经在使用自己的自定义哈希解决方案。

关于java - Scala murmur 哈希与 Java 原生哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980193/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com