Hash,一般翻译做散列,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
Hash算法能将将任意长度的二进制明文映射为较短的二进制串的算法,并且不同的明文很难映射为相同的Hash值。
哈希算法(Hash Algorithm)是一种将任意长度的消息映射为固定长度的消息摘要(Message Digest)的算法。哈希算法可以将任意长度的输入数据转换为固定长度的输出,通常称为哈希值(Hash Value)或摘要(Digest),并且满足以下特性:
1.确定性:对于相同的输入数据,哈希算法会生成相同的哈希值。
2.不可逆性:无法从哈希值中推导出原始的输入数据。
3.唯一性:不同的输入数据生成的哈希值应尽可能不同。
4.散列性:即使输入数据仅有微小的变化,生成的哈希值应该有很大的差异。
哈希映射可以快速地通过一个键查找到对应的值,它的内部实现为数组。当添加一个键和值时,键会通过哈希算法转变为一个数。每个键产生的数并不是唯一的。哈希算法可以将不同的键转化为同一个值,然后将这个值作为数组的索引。数组中的每个元素称为桶,键-值对就存储在桶中。如果桶中已经有一个键了,那么新的值会替换原先的值。
每个桶也可视为一个数组,所以桶可以容纳多个值。如果两个键存在于同一个桶中,这种情况称为碰撞,两个键和值就都存储在这个桶中。
从哈希映射中读取数据的方式一样。通过哈希算法将键转化为一个数字,然后找到对应的桶,接着遍历桶中的键找出是否有相同的键。如果找到了,就返回对应的值。
要尽量避免过多的碰撞,因为碰撞越多,从哈希映射中取得结果的时间也会越长,这是因为我们要花更多的时间去遍历同一个桶中的所有键。巧妙的哈希算法会保证碰撞次数最小化,并且如果桶中添加了足够多的元素,哈希映射会重新调整桶的大小以装下更多元素。
mport hashlib
h1=hashlib.md5()
h1.update('helloworld'.encode('utf-8'))
print('md5:'+h1.hexdigest())
SHA224:
import hashlib
h2=hashlib.sha224()
h2.update('helloworld'.encode('utf-8'))
print('sha224:'+h2.hexdigest())
SHA1:
import hashlib
h3=hashlib.sha1()
h3.update('helloworld'.encode('utf-8'))
print('sha1:'+h3.hexdigest())
SHA256:
import hashlib
h4=hashlib.sha256()
h4.update('helloworld'.encode('utf-8'))
print('sha256:'+h4.hexdigest())
SAH384:
import hashlib
h5=hashlib.sha384()
h5.update('helloworld'.encode('utf-8'))
print('sha384:'+h5.hexdigest())