可变、不可变数据类型和hash
2024-08-23 23:28:27
一、可变和不可变数据类型
在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))
'''
最新文章
- bzoj4398:福慧双修
- 关于JqueryEasyUI集合Kindeditor
- gTest详解
- VFP不同句柄 同一事务处理 统一提交或回滚
- WinForm 文本框验证
- Hadoop学习笔记(老版本,YARN之前),MapReduce任务Namenode DataNode Jobtracker Tasktracker之间的关系
- C# winform编程中多线程操作控件方法
- .net System.TypeInitializationException 类型初始值设定项引发异常
- angular指令浅谈
- 用纯jsp实现用户的登录、注册与退出
- Docker之dockerfile
- POJ 1472 Coins (多重背包+滚动数组)
- bzoj:1230: [Usaco2008 Nov]lites 开关灯
- MinerDB.java 数据库工具类
- ajax发送请求跨域 - uri java代理
- ASP.NET Core入门
- linux centos 7 nodejs 的安装
- 主机性能监控之wmi 获取磁盘信息
- Hello 2018 A,B,C,D
- one by one 项目 part 5