简要的说,可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。python
它是一个将大致量数据转化为很小数据的过程,甚至能够仅仅是一个数字,以便咱们能够用在固定的时间复杂度下查询它,因此,哈希对高效的算法和数据结构很重要。算法
同理,不可哈希的数据类型,便可变的数据结构 (字典dict,列表list,集合set)。数据库
hash() 用于获取取一个对象(字符串或者数值等)的哈希值。返回对象的哈希值。数组
哈希(hash)也翻译做散列。Hash算法,是将一个不定长的输入,经过散列函数变换成一个定长的输出,即散列值。
这种散列变换是一种单向运算,具备不可逆性即不能根据散列值还原出输入信息,所以严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM三、MD五、SHA-1等 。安全
Hash主要应用在数据结构以及密码学领域。
在不一样的应用场景下,hash函数的选择也会有所侧重。好比在管理数据结构时,主要要考虑运算的快速性,而且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不一样明文hash值相同的状况发生。数据结构
在密码学中,Hash算法的做用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。好比一些登录网站并不会直接明文存储用户密码,存储的是通过hash处理的密码的摘要(hash值),当用户登陆时只须要对比输入明文的摘要与数据库存储的摘要是否相同;即便黑客入侵或者维护人员访问数据库也没法获取用户的密码明文,大大提升了安全性。函数
使用Hash算法的数据结构叫作哈希表,也叫散列表,主要是为了提升查询的效率。它经过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫作哈希表。在数据结构中应用时,有时须要较高的运算速度而弱化考虑抗碰撞性,能够使用本身构建的哈希函数。网站
>>> n = hash(1) >>> n 1 >>> n = hash(1.0) >>> n 1
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> m = hash('Vivian') >>> m -2338955002766744599 # 第一次哈希值 >>> exit() C:\Users\Administrator>python Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> m = hash('Vivian') >>> m 2113605006884176523 # 第二次哈希值
这是因为Python的字符串hash算法有一个启动时随机生成secret prefix/suffix的机制,存在随机化现象:对同一个字符串输入,不一样解释器进程获得的hash结果可能不一样。所以当须要作可重现可跨进程保持一致性的hash,须要用到hashlib模块。加密
hashlib提供了常见的摘要算法,如MD5,SHA1等等翻译
注:coding:utf-8
import hashlib # md5 m = hashlib.md5() m.update(b'Vivian') print(m.digest()) # 返回二进制的哈希值 b'\xe5if5\x05\x02\x1a!wR\xd6\xfa(\xae\r\xcb' print(m.hexdigest()) # 返回十六进制的哈希值 e569663505021a217752d6fa28ae0dcb m.update('你好'.encode('utf-8')) print(m.hexdigest()) # 6ea8d7a29ea0706bdaca285e1d2ddd17 # m两次加密后的值 等于 两次字串拼接后一次加密的值 n = hashlib.md5() n.update('Vivian你好'.encode('utf-8')) print(n.hexdigest()) # 6ea8d7a29ea0706bdaca285e1d2ddd17 # sha1 m = hashlib.sha1() m.update(b'Vivian') print(m.hexdigest()) # 587bf2d7314da0ae33623bed16d872620b2768be # sha256 m = hashlib.sha256() m.update(b'Vivian') print(m.hexdigest()) # 2f7caf725fb93a456e84100bdf98b91405e62f6e7ca99bc4e0b4a1993bf9e5c0 # sha512 m = hashlib.sha512() m.update(b'Vivian') print(m.hexdigest()) # d75e73edd6ab1801e3dbfcd5c504dca16f3c252f750411da7fdddc9b60013ad97844b6f86de29d3f9a6d07d2c93a53d6c9de9b548b8697f3c2494857176011dc