MENU

hashCode

December 7, 2021 • 编程,JAVA阅读设置

hashCode

public native int hashCode();

  • 这个方法是这么定义的,所有带有 native 的方法都是本地方法,它不是 java 写的。这个 hashcode 的返回值其实是实例对象运行时的内存地址
  • 什么是 hash 算法:
    一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。
  • hash 算法有几个特点:

    1. 只能通过原文计算出 hash 值,而且每次计算都一样,不能通过 hash 值计算原文。
    2. 原文的微小变化就能是 hash 值发生巨大变化。
    3. 一个好的 hash 算法还能尽量避免发生 hash 值重复的情况,也叫 hash 碰撞。
  • hash 的用途:

    1. 密码的保存:
      实际的工程当中我们一般不存储明文密码,而是将密码使用 hash 算法计算成 hash 值进行保存。这样即使密码丢失也不会使密码完全曝光。image_33ubgMLXxG.png
    2. 文件的校验,检查数据的一致性image_AWP5054_yl.png

常见的 Hash 摘要算法

MD5

介绍:MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。MD5 由美国密码学家【罗纳德·李维斯特】设计,于 1992 年公开,用以取代 MD4 算法。1996 年后该算法被证实存在弱点,可以被加以破解,对于需要 高度安全性的数据,专家一般建议改用其他算法,如 SHA-2。

public static void main(String[] args) throws Exception { 
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    byte[] digest = md5.digest("123".getBytes()); 
    System.out.println(Arrays.toString(digest));
}


//输出结果
[32, 44, -71, 98, -84, 89, 7, 91, -106, 75, 7, 21, 45, 35, 75, 112]

SHA 家族

正式名称为 SHA 的家族第一个成员发布于 1993 年。然而人们给它取 了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输 出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)

SHA-1

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法 1)是 一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所 (NIST)发布为联邦数据处理标准(FIPS)。SHA-1 可以生成一个被称为 消息摘要的 160 位(20 字节)散列值,散列值通常的呈现形式为 40 个十六 进制数。

public static void main(String[] args) Exception { 
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        byte[] digest = sha1.digest("123".getBytes()); 
        System.out.println(Arrays.toString(digest));
}
//输出结果
[64, -67, 0, 21, 99, 8, 95, -61, 81, 101, 50, -98, -95, -1, 92, 94, -53, -37, -66, -17]

SHA-2

SHA256

SHA256 算法使用的哈希值长度是 256 位。

public static void main(String[] args) throws Exception { 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
    byte[] digest = sha256.digest("123".getBytes()); 
    System.out.println(Arrays.toString(digest));
}

//输出结果
[-90, 101, -92, 89, 32, 66, 47, -99, 65, 126, 72, 103, -17, -36, 79, -72, 
-96, 74, 31, 63, -1, 31, -96, 126, -103, -114, -122, -9, -9, -94, 122, -29]

SHA512

算法使用的哈希值长度是 512 位。

public static void main(String[] args) throws Exception { 
    MessageDigest sha512 = MessageDigest.getInstance("SHA-512");
    byte[] digest = sha512.digest("123".getBytes());  
    System.out.println(digest);
}

//输出结果
[60, -103, 9, -81, -20, 37, 53, 77, 85, 29, -82,
 33, 89, 11, -78, 110, 56, -43, 63, 33, 115, -72,
  -45, -36, 62, -18, 76, 4, 126, 122, -79, -63,
   -21, -117, -123, 16, 62, 59, -25, -70, 97, 59, 
   49, -69, 92, -100, 54, 33, 77, -55, -15, 74, 
   66, -3, 122, 47, -37, -124, -123, 107, -54, 92, 68, -62]
Last Modified: February 6, 2023