深色模式
关于散列函数
散列函数
又称散列算法、哈希函数,散列函数是一种特殊的函数,将任意长度的输入数据映射为固定长度的输出数据,通常是一个固定长度的二进制序列。散列函数的主要目标是产生输出(哈希值或摘要),使得输入数据的微小变化都能导致输出值发生明显变化,并且不同的输入数据尽可能地产生不同的输出。
散列函数具有以下特征:
- 固定输出长度: 散列函数产生的输出长度是固定的,不受输入数据的大小影响。这使得不同大小的输入都能映射到相同长度的输出。
- 高效计算: 散列函数应该能够在合理的时间内计算出输出。这对于在计算机系统中处理大量数据是至关重要的。
- 一致性: 对于相同的输入,散列函数应该始终产生相同的输出。这是散列函数在不同系统和环境中的可靠性的关键因素。
- 雪崩效应: 散列函数应该对输入的微小变化产生显著的输出变化,这就是雪崩效应。即使输入的一位发生改变,输出也应该发生较大的变化。
- 抗碰撞性: 散列函数应该具有抗碰撞性,即使不同的输入映射到相同的输出,也应该是非常困难的。这是为了防止碰撞攻击,其中攻击者故意寻找两个不同的输入,使它们产生相同的哈希值。
- 不可逆性: 散列函数应该是不可逆的,即从哈希值推导出原始输入数据应该是困难的或不可行的。这是保护原始数据的隐私性的关键。
常见的哈希函数
- MD5
- SHA-1
- SHA-256
- SHA-512
- ...
哈希值的长度
在Go语言的crypto
包中,有以下代码,可以看出常见散列函数计算值的长度,单位是字节,转换成位需要乘以8。
go
var digestSizes = []uint8{
MD4: 16,
MD5: 16,
SHA1: 20,
SHA224: 28,
SHA256: 32,
SHA384: 48,
SHA512: 64,
SHA512_224: 28,
SHA512_256: 32,
SHA3_224: 28,
SHA3_256: 32,
SHA3_384: 48,
SHA3_512: 64,
MD5SHA1: 36,
RIPEMD160: 20,
BLAKE2s_256: 32,
BLAKE2b_256: 32,
BLAKE2b_384: 48,
BLAKE2b_512: 64,
}
示例
计算字符串hello world
的MD5
:
go
func main() {
source := "hello world"
hash := md5.New()
hash.Write([]byte(source))
md5Data := hash.Sum(nil)
md5Hex := hex.EncodeToString(md5Data)
fmt.Printf("md5: %s\n", md5Hex)
// md5: 5eb63bbbe01eeed093cb22bb8f5acdc3
}
计算字符串hello world
的SHA-256
:
go
func main() {
source := "hello world"
hash := sha256.New()
hash.Write([]byte(source))
sha256Data := hash.Sum(nil)
sha256Hex := hex.EncodeToString(sha256Data)
fmt.Printf("sha256: %s\n", sha256Hex)
// sha256: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
}