把任意长度的输入(又叫作预映射pre-image)经过散列算法变换成固定长度的输出,该输出就是散列值。python
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。算法
1 >>>hash('test') # 字符串 2 2314058222102390712 3 >>> hash(1) # 数字 4 1 5 >>> hash(str([1,2,3])) # 集合 6 1335416675971793195 7 >>> hash(str(sorted({'1':1}))) # 字典 8 7666464346782421378 9 >>>
在 hash() 对对象使用时,所得的结果不只和对象的内容有关,还和对象的 id(),也就是内存地址有关。函数
1 class Test: 2 def __init__(self, i): 3 self.i = i 4 for i in range(10): 5 t = Test(1) 6 print(hash(t), id(t)) 7 #输出结果 8 (277855628, 4445690048) 9 (277855637, 4445690192) 10 (277855628, 4445690048) 11 (277855637, 4445690192) 12 (277855628, 4445690048) 13 (277855637, 4445690192) 14 (277855628, 4445690048) 15 (277855637, 4445690192) 16 (277855628, 4445690048) 17 (277855637, 4445690192)
一种用途:spa
hash() 函数的对象字符无论有多长,返回的 hash 值都是固定长度的,也用于校验程序在传输过程当中是否被第三方(木马)修改,code
若是程序(字符)在传输过程当中被修改hash值即发生变化,若是没有被修改,则 hash 值和原始的 hash 值吻合,对象
只要验证 hash 值是否匹配便可验证程序是否带木马(病毒)。blog
1 name1='正常程序代码' 2 name2='正常程序代码带病毒' 3 print(hash(name1)) # 2403189487915500087 4 print(hash(name2)) # -8751655075885266653