摘要算法
摘要算法
最常见的例子:java 中的哈希码(hashcode)。
摘要算法,就是将很长的字符串,转换成固定长度的字符串,这种技术就是摘要。
你可能会觉得很熟,因为概念与哈希算法、散列算法完全一致,这几个算法是同一个算法。
摘要算法也不是加密算法,经过摘要计算之后,数据无法还原。
哈希碰撞
从算法的定义就能看出,必定存在两个不同的字符串,计算出完全一致的摘要。
这种情况称之为哈希碰撞,学哈希表的时候,会关注这个概念。
哈希碰撞,这个名词应该是最专业的,不过你搜这几个名词,也能找到相关内容:散列碰撞、散列冲突、哈希冲突。
用途一:哈希表
既然都叫哈希算法了,哈希表的设计必定与之相关,也就是说这个算法能用在数据结构上。
用途二:数据一致性检验
这个应用场景比较容易理解,在数据发送前,对数据进行一次摘要,数据收到后,进行同样的摘要计算,如果结果相同,那么说明本次接收到完整的数据。
最简单的摘要算法
将姓氏一样的人,放在一起管理。
从姓名中获取姓氏的过程,就是一种摘要算法,只不过这种算法,抗修改性较弱,姓氏一样的人很多,很容易发生哈希碰撞,因此,无法用在数据一致性检验上。
MD5摘要
Apache 提供的 commons-codec 中对 MessageDigest 进行了封装,可以直接使用,如果想自己实现,下面代码可以作为参考。
MD5算法生成字符串,其中十六进制转码 Hex 可以参考 commons-codec
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static byte[] digest(byte[] data) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data);
return md5.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static String hexBit32(String data) {
return Hex.encodeToString(digest(data.getBytes()));
}
public static String hexBit16(String data) {
return hexBit32(data).substring(8, 24);
}
public static void main(String[] args) {
System.out.println(MD5.hexBit16("12121212"));
}
}
常用的摘要算法
摘要算法是按照接口标准实现的,使用方法都是一样的,修改上面代码中 MessageDigest.getInstance() 这一行代码,即可实现其他摘要算法。
public static final String MESSAGE_DEGEST_MD2 = "MD2";
public static final String MESSAGE_DEGEST_MD5 = "MD5";
public static final String MESSAGE_DEGEST_SHA = "SHA";
public static final String MESSAGE_DEGEST_SHA_224 = "SHA-224";
public static final String MESSAGE_DEGEST_SHA_256 = "SHA-256";
public static final String MESSAGE_DEGEST_SHA_384 = "SHA-384";
public static final String MESSAGE_DEGEST_SHA_512 = "SHA-512";
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!