哈希算法(2022.6.22)
作用:对数据进行加密
目的:验证原始数据是否被篡改
哈希算法最重要的特点就是:
1.相同的输入一定得到相同的输出
2.不同的输入大概率得到不同的输出
Java字符串的hashCode()就是一个哈希算法,它的输入是任意字符串,输出是固定的4字节int整数:
"hello".hashCode(); // 0x5e918d2
"hello, java".hashCode(); // 0x7a9d88e8
"hello, bob".hashCode(); // 0xa0dbae2f
哈希碰撞
哈希碰撞是指,两个不同的输入得到了相同的输出,且碰撞无法避免:
"AaAaAa".hashCode(); // 0x7460e8c0
"BBAaBB".hashCode(); // 0x7460e8c0
一个安全的哈希算法必须满足:
1.碰撞概率低;
2.不能猜测输出(防止从输出反推输入)
常用的哈希算法有:
算法 | 输出长度(位) | 输出长度(字节) |
---|---|---|
MD5 | 128 bits | 16 bytes |
SHA-1 | 160 bits | 20 bytes |
RipeMD-160 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。