1.8 可变、不可变数据与hash

HASH   

 Hash, 一般翻译做'散列', 也有直接音译为'哈希'的, 就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转化是一种压缩映射,也就是,散列值得空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

特征:

hash 的值是根据输入值的特征计算的,这就要求被hash的值必须固定, 因此被hash的值必须是不可变得

用途:

文件签名

MD5加密

密码加密

  • 可变与不可变类型

可变类型

不可变类型

list    

bool, int, float, complex

dict

str

set

tuple

 

frozenset

列表

1>>> l = [1,2,3,4] 2>>> id(l) 34392665160 4>>> l[1] = 1.5 5>>> l 6[1, 1.5, 3, 4] 7>>> id(l) 84392665160

数字

1>>> a = 1 2>>> id(a) 34297537952 4>>> a+=1 5>>> id(a) 64297537984

从内存角度看列表与数字的变与不变

字符串

1#例1 2>>> s = 'hello' 3>>> s[1] = 'a' 4Traceback (most recent call last): 5 File "<pyshell#5>", line 1, in <module> 6 s[1] = 'a' 7TypeError: 'str' object does not support item assignment 8#例2 9>>> s = 'hello' 10>>> id(s) 114392917064 12>>> s += ' world' 13>>> s 14'hello world' 15>>> id(s) 164393419504 17 18#字符串也可以像列表一样使用索引操作,但是通过上例可以看出,我们不能像修改列表一样修改一个字符串的值,当我们对字符串进行拼接的时候,原理和整数一样,id值已经发生了变化,相当于变成了另外一个字符串。

元组——不允许修改

1>>> t = (1,2,3,4) 2>>> t[1] = 1.5 3Traceback (most recent call last): 4 File "<pyshell#10>", line 1, in <module> 5 t[1] = 1.5 6TypeError: 'tuple' object does not support item assignment

hash

假设现在要你存储一些数据如下,你会怎么存?

1张三 13980593357 2李四 15828662334 3王老五 13409821234 4 5[[‘张三’,13980593357][‘李四’,15828662334][‘王老五’,13409821234]]

像上面这样存行不行?

可以~现在咱们有一个需求,就是获取“王五”的电话号码,你怎么做?

遍历整个列表,找到“王五”的信息所在的列表,然后拿到王五的电话。看起来一切顺利。

但是当我们需要存储的人越来越多,这个寻找的过程就会变得非常漫长,如果我们存了5000万个人的信息,那么找人这个过程就变得像大海捞针一样了。。。有没有什么好办法能够让我们一下子就找到对应的人呢?

我们都知道数据是存储在内存里的,内存中的每一个位置都有自己的地址标示。假如我们能够将这些人名转换成数字直接存储在数字代表的内存地址中,等要找这个人的时候,直接去这个地址找人是不是就方便了?

1假如对上述的联系人信息进行存储时,采用的Hash函数为:姓名的每个字的拼音开头大写字母的ASCII码之和。因此 2address(张三)=ASCII(Z)+ASCII(S)=90+83=173; 3address(李四)=ASCII(L)+ASCII(S)=76+83=159; 4address(王老五)=ASCII(W)+ASCII(L)+ASCII(W)=87+76+87=250;

 

当然了,这只是一个示意图,具体的情况比这个还要复杂,还有很多复杂的因素都没有考虑进入,比如如果计算出来的hash值发生了冲突怎么办?还有现在这张图就可以看出空间上的浪费,这就需要我们在设计hash算法的时候不能像我刚刚假设的那样随意。但这已经足以向你说明hash算法的与众不同,它能为你在数据查找的过程中节省多少时间。

现在,告诉你一个好消息,你不需要关心hash值是如何计算的,因为python已经为我们设计了一套算法你只要拿来用就可以:

1>>> hash("张三") 26480394008723176318 3>>> hash("李四") 4-114706925611844552 5>>> hash("王老五") 63250319002057530081
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

哈希游戏搭建开发主要原理

区块链的算法主要有两个部分,一个是哈希算法,一个是非对称加密。哈希(Hash)是一种加密算法,也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(HashValue)、杂凑值或者消息摘要。它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过

Android常见的加密和算法

1.不可逆的算法主要为MD5和SHA1算法。(二者都不属于加密只能算作一种算法)相同点:都是使用目前比较广泛的散列(Hash)函数,就是把任意长度的输入,变换成固定长度的输出,该输出就是散列值。计算的时候所有的数据都参与了运算,其中任何一个数据变化了都会导致计算出来的Hash值完全不同。(理论上来讲产生的密文都有可能产生碰撞)不同点:M

Redis散列(Hash)的相关命令

散列就像一个减配的Redis内部及其类似Java的Map内容就是key:value结构hash类型在面向对象编程的运用中及其适合,因为它可以直接保存编程语言中的实体类关系增hsethsetkeyfieldvalue设置key指定的哈希集字段的值127.0.0.1:6379h

Hash算法解决冲突的四种方法

Hash算法解决冲突的方法一般有以下几种常用的解决方法 1,开放定址法: 所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 公式为:fi(key)(f(key)di)MODm(di1,2,3,……,m1) ※用开放定址法解决冲突的做法是:当冲突发