Tag: 哈希

如何为特定类编写hashCode方法?

我正在尝试为我的简单类生成一个hashCode()方法,但我没有得到它的任何地方。 我将不胜感激任何帮助。 我已经实现了equals()方法,如下所示,并且还想知道我是否需要实现compareTo()方法。 我已经导入了java.lang.Character来使用character.hashCode()但它似乎不起作用。 private class Coord{ private char row; private char col; public Coord(char x, char y){ row = x; col = y; } public Coord(){}; public char getX(){ return row; } public char getY(){ return col; } public boolean equals(Object copy){ if(copy == null){ throw new NullPointerException(“Object entered is empty”); } else if(copy.getClass()!=this.getClass()){ […]

在Java 8中更改为HashMap哈希函数

在java 8 java.util.Hashmap中,我发现了一个变化: static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); 到 : static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 从代码中可以看出,新函数是低16位的简单XOR ,高16位保持高16位不变,与之前实现中的几个不同的位移相反,并且从评论中看,这不太有效。将较低位的大量冲突的散列函数的结果分配给不同的桶,但通过减少操作来节省CPU周期。 我在发行说明中看到的唯一一件事就是从链接列表到平衡树的变化以存储碰撞键(我认为这可能会改变计算好哈希的时间量),我特别感兴趣的是看到如果此更改对大型哈希映射有任何预期的性能影响。 是否有关于此更改的任何信息,或者是否有更好的哈希函数知识的人知道此更改的含义可能是什么(如果有的话,我可能只是误解了代码)以及是否需要生成哈希迁移到Java […]

Java HashMap检测冲突

有没有办法在Java哈希映射中检测冲突? 任何人都可以指出可能发生大量碰撞的情况。 当然,如果你覆盖一个对象的哈希码并简单地返回一个常量值,肯定会发生冲突。我不是在谈论那个。我想知道前面提到的其他所有情况都发生了大量的碰撞无需修改默认的哈希码实现。

哈希和腌制价值观

我正在开发一个内部validation用户的小型Web应用程序。 一旦用户通过身份validation,我的Web应用程序就会将一些信息(如userID和Person的名称)传递给第三方Web应用程序。 第三方开发人员建议我们对值进行散列和加盐。 原谅我的无知,但究竟是什么意思呢? 我正在用Java编写应用程序。 所以我打算做的是将userID,Person的名称和一些Math.random()值作为Apache Commons Digest Utils SHA512的哈希值并将该哈希字符串与userID和person的名称一起传递。 这是标准做法吗? 我应该通过第三方盐也是正确的?

为什么Java的hashCode不支持通用散列?

一些散列表方案,例如布谷鸟散列或动态完美散列 ,依赖于通用散列函数的存在以及通过从通用散列函数族中选择新的散列函数来获取展示冲突的数据集合并解决这些冲突的能力。 前一段时间我试图在由cuckoo散列支持的Java中实现哈希表并遇到麻烦,因为虽然所有Java对象都有hashCode函数,但hashCode返回的值对于每个对象都是固定的(当然,除非对象发生变化) )。 这意味着如果没有用户提供外部通用散列函数系列,则无法构建依赖于通用散列的散列表。 最初我认为我可以通过直接对对象的hashCode应用通用哈希函数来解决这个问题,但是这不起作用,因为如果两个对象具有相同的hashCode ,那么你应用于那些哈希码的任何确定性函数,甚至是随机选择的散列函数,将导致相同的值,从而导致冲突。 看起来这对Java的设计是不利的。 这意味着完全禁止HashMap和其他哈希容器使用基于通用哈希的表,即使语言设计者可能认为这些表适合语言设计。 它还使第三方库设计者更难以构建此类哈希表。 我的问题是: 有没有理由认为Java选择设计hashCode而不考虑使用多个哈希函数散列对象的可能性? 我知道许多好的散列方案,如链式散列或二次探测都不需要它,但似乎这个决定使得在Java对象上使用某些类算法变得困难。

MessageDigest在不同的计算机上散列不同

我遇到MessageDigest在不同计算机上返回不同哈希值的问题。 一台计算机在Windows Vista上运行32位Java,另一台在Mac OS上运行64位Java。 我不确定是不是因为MessageDigest是依赖于机器的,或者我需要在某处明确指定字符编码,或者可能是其他东西。 这是代码: public static boolean authenticate(String salt, String encryptedPassword, char[] plainTextPassword ) throws NoSuchAlgorithmException { // do I need to explcitly specify character encoding here? –> String saltPlusPlainTextPassword = salt + new String(plainTextPassword); MessageDigest sha = MessageDigest.getInstance(“SHA-512”); // is this machine dependent? –> sha.update(saltPlusPlainTextPassword.getBytes()); byte[] hashedByteArray = sha.digest(); // or… perhaps […]

为什么即使我的hashcode值相同,’==’也会返回false

我写了一个类似的课程 public class HashCodeImpl{ public int hashCode(){ return 1; } public static void main(String[] args) { // TODO Auto-generated method stub HashCodeUtil h= new HashCodeUtil(); HashCodeUtil h1= new HashCodeUtil(); System.out.println(h.hashCode()); System.out.println(h1.hashCode()); System.out.println(h); System.out.println(h1); System.out.println(h==h1); } } 输出: 1 com.manu.test.HashCodeUtil@1 com.manu.test.HashCodeUtil@1 false 我的问题是:当我的hashCode方法返回相同的值时,为什么System.out.println(h==h1); 是假的? 请解释。

打印的哈希代码代替数组元素

我创建了一个程序,其中包含一个名为Student的新类,它设置并获取不同的变量,如名称,GPA,如果它们已注册以及何时注册(这是一个字符串,它的目的是)。 问题是,当我尝试将信息存储到数组和/或数组列表中并打印它时,我得到打印的哈希码而不是信息。 该程序并不完全,但我试图首先解决哈希码问题。 如果你能提供帮助我会非常感激。 先感谢您! Student st = new Student(); System.out.println(st.getName()); Student1(); Student st1 = new Student(“John”); } public static void Student1() { System.out.println(“Enter the data for student 1 :”); Student st = new Student(); Scanner keyboard = new Scanner(System.in); String name = keyboard.next(); double GPA = keyboard.nextDouble(); boolean enrolled = keyboard.nextBoolean(); String date = […]

为什么对象的Hashcode会在Java中发生变化?

为什么对象的Hashcode会在Java中发生变化? 它有变化吗? 它与Hashtable有什么关系? 每个对象都应该拥有它唯一的hashcode.So,正在重新推出它的原因吗? 提前致谢。

HashMap和并发 – 不同的密钥

假设我有一个哈希映射和多个线程。 如果我有一个添加到哈希映射的同步方法,我怎么能让两个不同的线程可以同时(并发)将不同的键放入哈希映射? 我当前的实现是一个同步方法。 这会允许两个不同的线程同时将两个不同的键放入哈希映射中吗? 我使用的是常规哈希映射,而不是Java的并发哈希映射。 我不允许使用并发哈希映射。 编辑:我想我找到了解决方案! 我想我可能错误地写了这篇文章。 假设哈希映射被初始化为Integer作为其键,LinkedList作为其值。 为了放置一个全新的密钥,我意识到整个哈希映射必须同步(即锁定)。 但是,如果我试图将另一个String添加到已经包含的键的相应LinkedList中,我可以同步哈希映射的get方法。 我认为这将允许多个线程同时(并发)添加到不同的,已包含的键的LinkedLists。 如果我错了,请告诉我。 这是一个具体的例子。 我有一个哈希映射hashMap,它使用Integer作为键,LinkedList作为其值。 键5和10已经在哈希映射中。 键5包含Joey,Joe,Kerry的LinkedList。 键10包含Jerry,Mary,Tim的LinkedList。 我有两个线程t1和t2。 t1想要将Moe添加到与密钥5对应的LinkedList中.t2想要将Harry添加到与密钥10对应的LinkedList中。两者将同时添加到散列映射中,因为散列映射的值仅被锁定。