Tag: 哈希码

覆盖hashCode() – 这还不错吗?

对于其字段仅为原始的类,例如: class Foo { int a; String b; boolean c; long d; boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Foo)) return false; Foo other = (Foo) o; return a == other.a && b.equals(other.b) && c == other.c && d = other.d; } } 这是一个合理的“足够好”的方式来编写hashCode()吗? boolean hashCode() { return (b […]

hashCode,实现以及与HashMap的关系

所以我在这里问了另一个相关的问题: 带有雪崩效应的java字符串哈希函数 ,但我现在有一个不同的相关问题。 我在那个问题中建立的是String的hashCode()函数没有雪崩效应。 这意味着,例如,如果我有字符串“k1”,“k2”,“k3”,并且我在每个上调用hashCode(),则返回的值将是连续的。 现在,基于我对数据结构101的回忆,我的印象是这是一件坏事。 因为假设HashMap通过算法选择桶,例如: class HashMap { private int capacity; private int chooseBucket(String key) { return key.hashCode() % capacity; } } 这意味着类似的密钥存储在连续的桶中,导致更高的冲突率,从O(1)降低大O查询时间到……谁知道有多糟糕……可能比O更差(log n )。 我在第一个问题中得到的答案类型是“这里不需要雪崩效应”,“它仅用于加密哈希函数”,而且“字符串的hashCode实现很快,适用于小型哈希映射”。 这让我很困惑。 当它们很小时,所有数据结构都很快。 Sun是否会提供一个适用于大型数据集的默认hashCode函数? 那时候HashMap的表现真的很重要,不是吗? 或者,我错过了什么? 请赐教。

为什么Java中没有Hashable接口

Java中的Object具有hashCode方法,但是它仅在HashSet或HashMap等关联容器中使用。 它为什么这样设计? 具有hashCode方法的Hashable接口看起来更优雅的解决方案。

来自一个字段的Java hashCode

编辑:准备我的对象以便在HashMap中使用。 在阅读了一些关于如何生成哈希码之后,我现在很困惑。 我的(可能是微不足道的)问题是,当我有一个可以使用的字段时,我应该如何实现hashCode方法? 我可以直接使用fiels吗? 如果我理解正确,hashCode的值在对象的生命周期内不能改变,我只有一个适合这个的ID,但是我已经在其他地方读过,那个人不应该使用ID …这个怎么样,怎么样一个基于这个(唯一且没有变化)值的hashCode函数会是什么样的? equals方法也仅基于id ..

如何以与List.hashCode()相同的方式计算流的哈希码

我刚刚意识到使用Stream.reduce(…)实现以下算法来计算流的哈希码是不可能的。 问题是哈希码的初始种子是1 ,它不是累加器的标识。 List.hashCode()的算法: int hashCode = 1; for (E e : list) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 您可能会认为以下内容是正确的但事实并非如此,尽管如果流处理没有拆分它会起作用。 List list = Arrays.asList(1,null, new Object(),4,5,6); int hashCode = list.stream().map(Objects::hashCode).reduce(1, (a, b) -> 31 * a + b); 似乎唯一合理的做法是获取Stream的Iterator并进行正常的顺序处理或首先将其收集到List 。

equals和hashCode:Objects.hash方法被破坏了吗?

我使用的是Java 7,下面有以下类。 我正确地实现了equals和hashCode ,但问题是equals在下面的main方法中返回false ,但hashCode为两个对象返回相同的哈希码。 我可以让更多的眼睛看这堂课,看看我在这里做错了吗? 更新:我用我自己的哈希函数替换了我调用Objects.hash方法的行: chamorro.hashCode() + english.hashCode() + notes.hashCode() 。 它返回一个不同的哈希码,这是当两个对象不同时hashCode应该做的事情。 Objects.hash方法被破坏了吗? 对你的帮助表示感谢! import org.apache.commons.lang3.StringEscapeUtils; public class ChamorroEntry { private String chamorro, english, notes; public ChamorroEntry(String chamorro, String english, String notes) { this.chamorro = StringEscapeUtils.unescapeHtml4(chamorro.trim()); this.english = StringEscapeUtils.unescapeHtml4(english.trim()); this.notes = notes.trim(); } @Override public boolean equals(Object object) { if (!(object instanceof ChamorroEntry)) […]

Java从哈希码重新创建字符串

有什么办法可以在java中使用字符串的哈希码,并重新创建该字符串? 例如这样的事情: String myNewstring = StringUtils.createFromHashCode(“Hello World”.hashCode()); if (!myNewstring.equals(“Hello World”)) System.out.println(“Hmm, something went wrong: ” + myNewstring); 我这样说,因为我必须将字符串转换为整数值,并从该整数值重构该字符串。

使用哈希码获取唯一ID

我在基于java的系统中工作,我需要在可视化显示中为某些元素设置id。 一类元素是字符串,所以我决定使用String.hashCode()方法来获取这些元素的唯一标识符。 然而,我遇到的问题是,如果id为负数且String.hashCode经常返回负值,我在borks工作的系统。 一个快速的解决方案是在hashcode调用周围使用Math.abs()来保证正结果。 我对这种方法感到疑惑的是,两个不同元素具有相同哈希码的可能性是多少? 例如,如果一个字符串返回的哈希码为-10,而另一个字符串返回的哈希码为10,则会发生错误。 在我的系统中,我们讨论的是通常不超过30个元素的对象集合,所以我不认为这确实是一个问题,但我很好奇数学所说的。

HashCode给出负值

我通过执行以下函数将传入的字符串转换为哈希码,但某些值为负值。 我不认为哈希值应该是负数。 请告诉我我做错了什么。 int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode(); System.out.println(combine);

高效的hashCode()实现

我经常使用IntelliJ IDEA自动生成类的hashCode()方法,通常该方法采用以下forms: result = 31 * result + … 我的问题是乘以31的目的是什么? 我知道这是一个素数,但为什么选择31? 另外,如果为特别小/大的数据集实现hashCode() ,人们会以不同的方式处理这个问题吗?