哈希(hash)也翻译做散列。Hash算法,是将一个不定长的输入,经过散列函数变换成一个定长的输出,即散列值。python
这种散列变换是一种单向运算,具备不可逆性即不能根据散列值还原出输入信息,所以严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM三、MD五、SHA-1等 。算法
Hash主要应用在数据结构以及密码学领域。数据库
在不一样的应用场景下,hash函数的选择也会有所侧重。好比在管理数据结构时,主要要考虑运算的快速性,而且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不一样明文hash值相同的状况发生。数组
在密码学中,Hash算法的做用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。好比一些登录网站并不会直接明文存储用户密码,存储的是通过hash处理的密码的摘要(hash值),当用户登陆时只须要对比输入明文的摘要与数据库存储的摘要是否相同;即便黑客入侵或者维护人员访问数据库也没法获取用户的密码明文,大大提升了安全性。安全
使用Hash算法的数据结构叫作哈希表,也叫散列表,主要是为了提升查询的效率。它经过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫作哈希表。在数据结构中应用时,有时须要较高的运算速度而弱化考虑抗碰撞性,可使用本身构建的哈希函数。数据结构
自定义哈希函数一般可利用除留余数、移位、循环哈希、平方取中等方法。下面这个例子就是我本身定义的一个哈希函数,运用了取模运算和异或运算。函数
# coding:utf-8 # 自定义哈希函数 def my_hash(x): return (x % 7) ^ 2 print(my_hash(1)) # 输出结果:3 print(my_hash(2)) # 输出结果:0 print(my_hash(3)) # 输出结果:1 print(my_hash(4)) # 输出结果:6
在python中有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于 list、set、dictionary)的哈希值。示例代码以下:网站
# coding:utf-8 # hash() print(hash(1)) print(hash(1.0)) # 相同的数值,不一样类型,哈希值是同样的 print(hash("abc")) print(hash("hello world"))
在运行时发现了一个现象:相同字符串在同一次运行时的哈希值是相同的,可是不一样次运行的哈希值不一样。这是因为Python的字符串hash算法有一个启动时随机生成secret prefix/suffix的机制,存在随机化现象:对同一个字符串输入,不一样解释器进程获得的hash结果可能不一样。所以当须要作可重现可跨进程保持一致性的hash,须要用到hashlib模块。加密
hashlib提供了常见的摘要算法,如MD5,SHA1等等。示例代码以下:翻译
# coding:utf-8 # 使用hashlib模块 import hashlib md5 = hashlib.md5() # 应用MD5算法 data = "hello world" md5.update(data.encode('utf-8')) print(md5.hexdigest())