python内建函数hash()针对不可变对象提供计算哈希值,但我觉得没啥用,可能这个函数的唯一作用就是python字典用了这个函数实现哈希。
python内建库hashlib库提供了很多哈希算法。
哈希算法也称为散列算法,就是把不可变对象依靠着哈希函数映射到一串字符。
哈希函数(不可变对象)= 哈希结果
性质:
- 1 不可变对象有无穷多个,哈希结果长度一般是唯一的,也就是说哈希结果个数是有限个。那么从无限个到有限个的映射,必然有哈希冲突:两个不一样的不可变对象映射到了同一个哈希结果。
- 2 显而易见的是,哈希结果的长度越长,能表示的不可变对象越多,冲突可能会少。
- 3 sha256就是一种哈希函数。长度还挺高。256个二进制位!
- 4 同一个不可变对象每次出来的哈希结果必须相同!
- 5 哈希函数计算得越快越好,这是哈希的用途理念决定的。
- 6 相似的不可变对象的哈希结果需要相差很大。
- 7 知道哈希结果反推出不可变对象,必须是一件不可能的事情。
import hashlib
import traceback
for i in ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512'):
try:
print(i,'------------>')
print(getattr(hashlib, i)("block_string".encode()).hexdigest())
except:
traceback.print_exc()
print(i)
结果
md5 ------------>
3042e468364703bfc1d2fd07306cb44b
sha1 ------------>
9560f723997057817cd85d068d3b579761122f1b
sha224 ------------>
32bbdcf30cca685f4aceaca23855596b9cd758844f4e9c81c449689e
sha256 ------------>
8f4a106f3a2c581fa60a968c74bf5e7b2ed4c03aa9739dadd197d6aae0c7d343
sha384 ------------>
047c4bbb27e91c2957bd588031dbadb86879ce2a12181c817077433a0f54dcfd23b16f22d8234b5d2be38ec0e7c97c54
sha512 ------------>
b796f690a39228c45952c3f5a1d12ca8086d4333c95b0855e31e7bcbcc1d88b0e8d250cbd89d9f11183733862d78b76984d16b316d512163a83b45f269912723
blake2b ------------>
2f2d7350968dd64f75fa7d045c6bbb70fedd20950e026d03c299f1aad29300572cc7f389e6eb4e5c8603d39dab720dc4087f200de51983d4683f74bd5aa36b61
blake2s ------------>
931e57c1ed77bfc3854a900dd4e5403d69ad4bb73d38289c214bd2abd508f874
sha3_224 ------------>
b25758d1ff393afa0c5bb07f9e7e3170d7bdf87c94a299db2c747a0c
sha3_256 ------------>
97ae01c43d6a0151fa4fd80fe565b39811950308fad5b8fac4b89515084f7307
sha3_384 ------------>
d9a5d65d50c0b8364686e5752fb990d3bb03314255b83924992a451c51ec45e679c60b379c86ff5f6aba9b11c9a928ea
sha3_512 ------------>
8cb00f6b561d411ecb8ec9b0de57ae34ddece0ac3cf10f1c338629815a7301113de00d4ffc7f8da510ff46bc0cbc62bb944d2d9896bfc3e416485c60a4d66e6d