自增知识点

1,哈希

什么是可哈希(hashable)?

简要的说可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。

  哈希有啥作用?

它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。

什么是不可哈希(unhashable)?

同理,不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set)

hash(object)

hash() 用于获取取一个对象(字符串或者数值等)的哈希值。返回对象的哈希值。

Hash算法(含python实现)

  1. 简介

    哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。

    这种散列变换是一种单向运算,具有不可逆性即不能根据散列值还原出输入信息,因此严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。

  2. 应用

    Hash主要应用在数据结构以及密码学领域。

    在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的快速性,并且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不同明文hash值相同的情况发生。

    2.1 在密码学领域的应用

    在密码学中,Hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。比如一些登陆网站并不会直接明文存储用户密码,存储的是经过hash处理的密码的摘要(hash值),当用户登录时只需要对比输入明文的摘要与数据库存储的摘要是否相同;即使黑客入侵或者维护人员访问数据库也无法获取用户的密码明文,大大提高了安全性。

    2.2 在数据结构中的应用

    使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表。在数据结构中应用时,有时需要较高的运算速度而弱化考虑抗碰撞性,可以使用自己构建的哈希函数。

  3. Hash算法的python实现

    3.1 自定义哈希函数

    自定义哈希函数通常可利用除留余数、移位、循环哈希、平方取中等方法。下面这个例子就是我自己定义的一个哈希函数,运用了取模运算和异或运算。

  4. coding:utf-8

  5. 自定义哈希函数

  6. def my_hash(x):

  7.  return (x % 7) ^ 2
  8. print(my_hash(1)) # 输出结果:3

  9. print(my_hash(2)) # 输出结果:0

  10. print(my_hash(3)) # 输出结果:1

  11. print(my_hash(4)) # 输出结果:6

    3.2 hash()函数

    在python中有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于 list、set、dictionary)的哈希值。示例代码如下:

  12. coding:utf-8

  13. hash()

  14. print(hash(1))

  15. print(hash(1.0)) # 相同的数值,不同类型,哈希值是一样的

  16. print(hash("abc"))

  17. print(hash("hello world"))

    在运行时发现了一个现象:相同字符串在同一次运行时的哈希值是相同的,但是不同次运行的哈希值不同。这是由于Python的字符串hash算法有一个启动时随机生成secret prefix/suffix的机制,存在随机化现象:对同一个字符串输入,不同解释器进程得到的hash结果可能不同。因此当需要做可重现可跨进程保持一致性的hash,需要用到hashlib模块。

    3.3 hashlib模块

    hashlib提供了常见的摘要算法,如MD5,SHA1等等。示例代码如下:

  18. coding:utf-8

  19. 使用hashlib模块

  20. import hashlib

  21. md5 = hashlib.md5() # 应用MD5算法

  22. data = "hello world"

  23. md5.update(data.encode('utf-8'))

  24. print(md5.hexdigest())

可变类型的数据不可哈希,如list,字典:同值不同址,不同值同址

列表,字典可变,

数值、字母、字符串、数字、元组不可变:同值同址,不同值不同址

怎么判断可变不可变 ?总结:改个值 看id是不是一样,id一样的为可变,则不可哈希,

改了值,id变化,则为不可变,则可哈希

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

哈希算法:哈希算法是用来解决数据和数据之间对应关系的一种算法。它的初衷是用来加速数据存取。

计算机领域内的大多数查找算法都与存储数据的规模呈正相关,用于衡量查找算法效率的量我们称为平均查找长度,一般情况下,比较优秀的查找算法的平均查找长度也不会短于数据规模以2为底的对数()。

python hash 哈希值的更多相关文章

  1. 上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 <!DOCTYPE html> <html xmlns=&q ...

  2. C++/python求哈希值(SHA256)

    发现一个很奇怪的现象: python语言求哈希值所用时间竟然比C++少: C++ code 1 #include "stdafx.h" 2 #include <windows ...

  3. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  4. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置

    Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...

  5. Python hash() 函数

    Python hash() 函数  Python 内置函数 描述 hash() 用于获取取一个对象(字符串或者数值等)的哈希值. 语法 hash 语法: hash(object) 参数说明: obje ...

  6. K:hash(哈希)碰撞攻击

    相关介绍:  哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...

  7. 【C# 集合】Hash哈希函数 |散列函数|摘要算法

    希函数定义 哈希函数(英語:Hash function)又称散列函数.散列函数.摘要算法.单向散列函数.散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该函数将数据打乱混合,重新 ...

  8. Python实现哈希表(分离链接法)

    一.python实现哈希表 只使用list,构建简单的哈希表(字典对象) # 不使用字典构造的分离连接法版哈希表 class HashList(): """ Simple ...

  9. Hash哈希(一)

    Hash哈希(一) 哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知 ...

随机推荐

  1. 4. gitlab 安装、项目创建

    官网: https://about.gitlab.com/ https://docs.gitlab.com/omnibus/maintenance/README.html#get-service-st ...

  2. 第十四周博客作业 <西北师范大学| 周安伟>

    第十四周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10909068 ...

  3. Pwn-Smashes

    题目地址 https://dn.jarvisoj.com/challengefiles/smashes.44838f6edd4408a53feb2e2bbfe5b229 友链 https://www. ...

  4. day81_10_30redis的简单操作。

    一.启动redis 在启动redis中可以持续的启动redis服务端,启动的服务端即使被关掉也不会停止服务: >: redis-server & 在客户端连接刚刚启动的redis服务端: ...

  5. 浅谈C++ STL deque 容器

    浅谈C++ STL deque 容器 本篇随笔简单介绍一下\(C++STL\)中\(deque\)容器的使用方法及常见使用技巧. deque容器的概念 \(deque\)的意义是:双端队列.队列是我们 ...

  6. 利用数据库视图实现WEB查询敏感信息接口动态脱敏

    前言: 利用数据库视图,实现web接口查询敏感信息时动态脱敏. 具体目标:某接口为用户信息查询接口,返回敏感用户信息(id,姓名.手机号[敏感].身份证号[敏感]),如果web用户为管理员角色,则查询 ...

  7. 手把手教你使用gogs搭建git私有仓库

    本来想在 Github 上建一个私仓,但是发现只能设置 3 个贡献者. 国内的码云也只能设置 5 个. 无意间看到了使用 gogs 可以搭建私服,正好手头有空闲的服务器,于是开干! https://g ...

  8. golang基础之第一个go程序

    编写 Hello World 创建文件 hello.go,不写入任何内容.按照如下的命令尝试进行编译 $ go run hello.go 将会打印出如下错误: package main: hello. ...

  9. 在Windows下的virtualenv中搭建Flask+MySQLDb开发环境

    virtualenv和Flask的安装前面已经介绍过了,这里主要讲如何在venv中安装MySQL 安装MySQLdb 下载MySQL-python-1.2.3.win32-py2.7.exe并安装. ...

  10. SQL Server 2014:为什么数据库里的表提示“单元格是只读的”,不能修改?该如何处理?

    出现以上这种情况,首先看一下这个字段的属性“标识规范”是不是选了“是”,自增属性下是不能修改的,属于只读.