可变、不可变数据类型和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

时间: 2024-10-11 03:54:10

可变、不可变数据类型和hash的相关文章

MySql数据类型和Java数据类型对应一览

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1               INTEGER 4 INTEGER UNSIGNED java.la

数据类型和typeof操作符

虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类型: js有5中基本的数据类型:undefined,Null,Boolean,Number,string;有一种复杂的数据类型:object,js不支持所有自定义的数据类型,所以所有变量的值都是以上类型. typeof:它的出现用来检测变量的数据类型,它可能的值有6种. undefined---如果

mysql的char数据类型和varchar数据类型的选择

mysql的char数据类型和varchar数据类型的选择 存储引擎对于选择char和varchar的影响: 对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列.这样可以使整个表静态化,从而使数据检索更快,用空间换时间 对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用char不一定比使用 varchar更好,但由于varchar是按照实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好 mysql并

Java数据类型和MySql数据类型对应表(转)

Java数据类型和MySql数据类型对应表 java mysql 数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1        

Java数据类型和MySql数据类型对应表

Java数据类型和MySql数据类型对应表: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNED java.lang.Long 4 TI

Java数据类型和MySql数据类型对应一览

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1               INTEGER 4 INTEGER UNSIGNED java.la

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.SQL SERVER与MySQL数据存储的差异 1.SQL SERVER中的datetime,保留到微秒(秒后小数点3位),而mysql仅保留到秒,转换后是否会影响业务,如果影响,需要新增一个字段专门来存储微秒或者毫秒,虽然mysql中没有时间数据类型的精度到达微秒或者毫秒,但是mysql提供对微秒的

可变,不可变类型和hash

可变与不可变类型 截止到目前为止我们已经学过很多数据类型:数字类型.字符串类型.列表类型.元祖类型. 在python中,我们对数据类型还有另外一种分类方式,我们给数据类型分为可变数据类型和不可变数据类型.在了解原理之前,我们先来看看分类情况: 可变类型 不可变类型 列表 数字   字符串   元组 看着上面这句话,我们来看看什么叫可变什么叫不可变 列表 >>> l = [1,2,3,4] >>> id(l) 4392665160 >>> l[1] =

Foundation框架常用数据类型和NSAutoreleasePool自动释放池解析

第一.NSAutoreleasePool自动释放池解析 1.自动释放池的物理实现 自动释放池用栈来实现,当你创建一个新的自动释放池是,会压栈到栈顶,接受autorelease消息的对象也会被压入到栈顶 NSAutoreleasePool实现延时释放,内部包含一个数组(NSMutableArray),用来保存声名为autorelease的所有对象.如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去.NSAutoreleasePool自身在销毁的时候,会遍历一遍