可变、不可变数据类型和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))
'''
可变、不可变数据类型和hash的更多相关文章
- Java数据类型和MySql数据类型对应一览
类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CHAR N ...
- 数据类型和typeof操作符
虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类 ...
- Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)
Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.S ...
- SQL数据类型和C#数据类型间的转换
今天看到SQL数据类型和C#数据类型间的转换,前人留下的. <?xml version="1.0" encoding="utf-8" ?> < ...
- MySql数据类型和Java数据类型对应一览
类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CHAR N ...
- Java数据类型和MySql数据类型对应一览 [转]
类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CHAR N ...
- mysql数据类型和java数据类型匹配
Java数据类型和MySql数据类型对应一览 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java. ...
- 可变,不可变类型和hash
可变与不可变类型 截止到目前为止我们已经学过很多数据类型:数字类型.字符串类型.列表类型.元祖类型. 在python中,我们对数据类型还有另外一种分类方式,我们给数据类型分为可变数据类型和不可变数据类 ...
- python数据类型和3个重要函数
Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值. 而这里说的不可变指的是值的不可变. 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被 ...
随机推荐
- 【git】git知识梳理(一):基本操作&远程控制&分支管理
(一)基本操作: git中所有文件一共有三个状态:已提交,已暂存,已修改. 三个工作区域: git目录:.git文件夹,每次拷贝其实只拷贝git目录 工作目录:文件和目录都是从git目录中压缩对象数 ...
- [QT]QToolBox 抽屉控件初步学习使用
创建一个不带界面的widget工程201701100038. main.c #include "widget.h" #include <QApplication> #i ...
- 【转载】 用 Windows API “GetAdaptersInfo” 获取 MAC 时遇到的问题
From:http://blog.csdn.net/weiyumingwww/article/details/17554461 前段时间有个项目需要获取客户端的 MAC 地址,用作统计去重的参考数据. ...
- linux基础【文件夹含义】
linux文件目录是一个树状的目录 bin -->可执行文件 boot-->操作系统引导文件,系统内核,启动信息 dev -->device,设备信息,计算机硬件设备信息 etc - ...
- cnn(卷积神经网络)比较系统的讲解
本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之 ...
- 剑指offer-第四章解决面试题思路(复杂链表的复制)
题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制. 复杂链表的数据结构如下:public class ComplexListNode{int m_nVal ...
- 【转载】Allegro Auto Rename器件反标注教程
Cadence设计时一般不主张在PCB文件中更改Logic(PADS的ECO更改),不过Auto Rename仍然是非常实用的功能,按照布局重排位号,可以让PCB的丝印标识更清晰,容易检查,位号易找, ...
- gerrit简版教程
设置public key 1.生成密钥:ssh-keygen -t rsa -C "xiaoming" 2.查看是否已经有了ssh密钥:cd ~/.ssh 3.不知道为什么hook ...
- Sql 中Collate用法
今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...
- android生命周期参考
public class ActivityDemo extends Activity { private static final String TAG = "ActivityDemo&qu ...