可变、不可变数据类型和hash

一、可变和不可变数据类型

  在python中,我们对数据类型除了分为数字类型、字符串类型、列表类型、元组类型、字典类型和集合类型外,

还有另外一种分类方式,我们给数据类型分为可变数据类型和不可变数据类型。

  可变数据类型:列表、字典。

  不可变数据类型:数字、字符串、元组。

二、hash 

什么是hash呢?

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

   可使用的对象包括: 数字 、字符串、元组,不可使用hash函数的是 列表、字典。

        hash的特征:hash值的计算过程是以依据这个值的特征计算的,这要求被hash的值必须固定,因此被hash的值必须不可变

       用途: 文件签名 、 md5加密 、 密码验证

  

  我们都知道数据是存储在内存里的,内存中的每一个位置都有自己的地址标示。当我们存储了上百万的人名的数据,当我们查找的时候将是一个

漫长的过程,假如我们能够将这些人名转换成,数字直接存储在数字代表的内存地址中,等要找这个人的时候,直接去这个地址找人是不是就方便了? 

  例如:    

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

 但具体的情况比这个要复杂很多,还有很多复杂的因素都没有考虑进入,比如如果计算出来的hash值发生了冲突怎么办?还有现在这张图就可以看出空间上的浪费,
这就需要我们在设计hash算法的时候不能像我刚刚假设的那样随意。但这已经足以向你说明hash算法的与众不同,它能为你在数据查找的过程中节省很多时间。
  然而好消息是,我们不需要关心hash值是如何计算的,因为python已经为我们设计了一套算法你只要拿来用就可以,如下:
n = 3
name = 'congocong'
print(hash(name),hash(n))
name = 'cc'
names = ('cc',1,2,3)
print(hash(name),hash(names))

'''
hash针对列表时会出错,因为列表可变
names = [4,5,6,('sc',21)]
print(hash(names))
'''




原文地址:https://www.cnblogs.com/schut/p/8407731.html