Java中的哈希码(HashCode)是一种数字摘要算法,它可以将任意长度的输入数据映射为固定长度的输出数据。哈希码是一种不可逆的加密方式,它可以将原始数据转换成一个固定长度的唯一值,这个值就是哈希码。
Java中的哈希码有很多用途,最常用的就是用来校验文件完整性。当我们下载文件时,服务器会向我们发送一个文件的哈希码;当我们将文件保存到本地之后,再使用相同的加密方式生成该文件的哈希码;如果生成出来的和服务端发送过来的相同,则说明文件没有被修改过。
此外,Java中也可以使用哈希码来存储密码。当用户注册时,将用户输入的密码使用特定加密方式生成一个固定长度的字符串作为该用户密码在数据库中存储的内容。当用户再次尝试使用该密码时,将其使用相同加密方式生成一个固定长度字符串并进行匹配即可。
public static String getHashCode(String str) { if (str == null || str.length() == 0) { return ""; } try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(str.getBytes("utf-8")); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { int bt = b & 0xff; if (bt < 16) { sb.append(0); } sb.append(Integer.toHexString(bt)); } return sb.toString(); } catch (Exception e) { return null; } }
哈希码是一个整数值。计算整数的算法称为散列函数。
Java使用散列码从基于散列的集合中有效地检索数据。
Object类有一个返回int的hashCode()方法,它是对象的哈希码。
该方法的默认实现通过将对象的内存地址转换为整数来计算对象的哈希码。
下面是我们在类中重写hashCode()方法时必须遵循的规则。
假设有两个对象引用,x和y。
如果x.equals(y)返回true,x.hashCode()必须返回一个整数,它等于y.hashCode()。
如果两个对象使用equals()方法相等,则它们必须具有相同的哈希码。
如果x.hashCode()等于y.hashCode(),则x.equals(y)不必返回true。
如果对同一个对象多次调用hashCode()方法,则该方法必须返回相同的整数值。
如果一个类覆盖这两个方法中的任何一个,它必须覆盖该类的对象在基于散列的集合中正确工作。
Java 7添加了一个实用程序类java.lang.Objects。它包含一个hash()方法,用于计算任意数量值的哈希码。
从java 7,使用Objects.hash()方法来计算对象的哈希码。
以下代码显示如何计算哈希值。
class Book { private String title; private String author; public int hashCode() { int hash = 37; int code = 0; // Use title code = (title == null ? 0 : title.hashCode()); hash = hash * 59 + code; // Use author code = (author == null ? 0 : author.hashCode()); hash = hash * 59 + code; return hash; } }
Java面向对象设计 -Java静态内部类静态成员类不是内部类在另一个类的主体中定义的成员类可以声明为静态。例子以下代码声明了顶级...
Java面向对象设计 - Java继承子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。从另一个类继承一个类非常简...
Java面向对象设计 - Java抽象类和方法Java可以定义一个类,其对象不能被创建。它的目的只是表示一个想法,这是其他类的对象共有...
Java面向对象设计 -Java泛型方法和构造函数泛型方法我们可以在方法声明中定义类型参数,它们在方法的返回类型之前的尖括号中指定...