hashCode
public native int hashCode();
- 这个方法是这么定义的,所有带有 native 的方法都是本地方法,它不是 java 写的。这个 hashcode 的返回值其实是实例对象运行时的内存地址。
- 什么是 hash 算法:
一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。 hash 算法有几个特点:
- 只能通过原文计算出 hash 值,而且每次计算都一样,不能通过 hash 值计算原文。
- 原文的微小变化就能是 hash 值发生巨大变化。
- 一个好的 hash 算法还能尽量避免发生 hash 值重复的情况,也叫 hash 碰撞。
hash 的用途:
- 密码的保存:
实际的工程当中我们一般不存储明文密码,而是将密码使用 hash 算法计算成 hash 值进行保存。这样即使密码丢失也不会使密码完全曝光。 - 文件的校验,检查数据的一致性
- 密码的保存:
常见的 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]