哈希

哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。

哈希的特点

哈希算法最重要的特点就是:

  • 相同的输入一定得到相同的输出;
  • 不同的输入大概率得到不同的输出。

    哈希碰撞

    哈希碰撞是指,两个不同的输入得到了相同的输出:

    1. "AaAaAa".hashCode(); // 0x7460e8c0
    2. "BBAaBB".hashCode(); // 0x7460e8c0

    碰撞不可怕,我们担心的不是碰撞,而是碰撞的概率,因为碰撞概率的高低关系到哈希算法的安全性。一个安全的哈希算法必须满足:

  • 碰撞概率低;

  • 不能猜测输出(不能找出规律反推)。

    常用的哈希算法有:

    | 算法 | 输出长度(位) | 输出长度(字节) | | —- | —- | —- | | 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 |

根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。

哈希算法的用途

  • 判断是否篡改

因为相同的输入永远会得到相同的输出,因此,如果输入被修改了,得到的输出就会不同。

  • 密码加密

当数据库泄漏之后,也看不到用户的密码。