Tag: 哈希哈希码

具有雪崩效应的java字符串哈希函数

在使用String.hashCode()进行测试时,我注意到它没有雪崩效应 。 我知道有一个Jenkins哈希的Java端口,但我想知道是否有一个哈希函数,可能在某些apache库或其他东西,有这个属性。 编辑:我正在寻找一个展示此属性的函数,并返回一个32位(或64位)整数(例如,像Jenkins哈希)。 我没有将它用于加密,我不打算一般替换String.hashCode。 我只是觉得hashCode有这个属性,事实certificate它没有,我想知道java的标准库或者apache lib中是否有任何东西可以满足我的需要。

equals()没有hashCode()

如果我只需要比较对象而不打算将对象放入任何基于散列的容器中,我可以只实现equals()而不是hashCode()吗? 似乎所有Java圣经都说这两个必须一起实现。 🙁 我关注的是: – 如果我总是和equals()一起实现hashCode(),那么会有很多代码没有真正使用,并且没有unit testing覆盖。 (如果不使用的话,我不打算unit testinghashCode()) – 只有当我将对象放入基于散列的容器中时才会知道如何查找对象。 直到那时我才能确定使用哪种散列策略。

为什么java中的默认hashcode()不好?

如果我没记错的话,在Object()类型的对象的java中默认的hashCode()实现是返回对象的内存地址。 当我们创建自己的类时,我读到我们想要覆盖hashCode(),这样当我们将它们插入到哈希相关的集合(如HashMap())时,它将正常工作。 但为什么内存地址不好? 当然,我们将永远耗尽内存并且你会遇到冲突,但我认为这是一个问题的唯一情况是你处理TONS数据并且内存很少,然后它会开始影响性能,因为java中的哈希相关集合通过链接解决冲突(存储桶将链接到解析为相同哈希码/索引的值列表)。

在重写hashCode()时使用较大的素数作为乘数

我已经阅读了过去几个小时的哈希码函数,并且在自定义哈希码实现中使用素数作为乘数已经积累了一些问题。 如果我能对以下问题有所了解,我将不胜感激: 在@ mattb的答案评论中, @ hstoerr主张使用更大的素数(例如524287)而不是公共素数31.我的问题是,给定一对或元素的哈希码函数的以下实现: @Override public int hashCode() { final int prime = 31; int hash1 = (pg1 == null) ? 0 : pg1.hashCode(); int hash2 = (pg2 == null) ? 0 : pg2.hashCode(); return prime * (hash1 ^ hash2); } 如果prime是一个大数字,这不会导致返回的int溢出? 假设溢出不是问题(JVM进行自动转换)是否更好的做位移而不是转换? 我认为哈希码函数的性能根据哈希码的复杂性而有很大差异。 主乘数的大小是否不影响性能? 在自定义哈希码函数中使用多个素数而不是单个乘法器更好/更智能/更快? 如果没有,还有其他一些优势吗? 请参阅@ jinguy对相关问题的回答中的示例: public int hashCode() { […]

Java:重复的对象被添加到set?

如果我运行以下代码,则输出为2,这意味着该集合包含2个元素。 但是我认为该集应该包含1,因为两个对象基于hashcode()值和.equals()方法是相等的。 在我的理解中似乎有些明显的错误? package HELLO; import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args) throws Exception { Set s = new HashSet(); Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); s.add(a1); s.add(a2); System.out.println(s.size()); } } class Alpha { int a = 10; public int hashcode() { return a; } […]

创建hashCode()方法 – Java

我在为我创建的类编写hashCode()方法时遇到了一些麻烦。 此类旨在在TreeSet中使用,因此,它实现了Comparable。 该类具有以下变量: public class Node implements Comparable { Matrix matrix; int[] coordinates= new int[2]; Node father; int depth; int cost; 这是compareTo()方法的实现。 我希望TreeSet按其成本组织这些Node结构,因此, compareTo()返回简单减法的结果。 public int compareTo(Node nodeToCompare) { return this.cost – nodeToCompare.cost; } 我还实现了equals()方法。 public boolean equals(Object objectToCompare) { if(objectToCompare== this) {return true;} if(objectToCompare== null || objectToCompare.getClass()!= this.getClass()) {return false;} Node objectNode= (Node) objectToCompare; […]

为什么hashCode()为Java中的不同对象返回相同的值?

从我正在阅读Head First Java的书中引用: 关键是,哈希码可以是相同的,而不必保证对象是相等的,因为hashCode()方法中使用的“哈希算法”可能会为多个对象返回相同的值。 为什么hashCode()方法可能为不同的对象返回相同的值? 这不会导致问题吗?