摘要算法

摘要算法

最常见的例子: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";

posted on 2018-05-23 22:20  疯狂的妞妞  阅读(753)  评论(0编辑  收藏  举报

导航