Python如何哈希字符串的哈希值

Python 学习笔记- hashlib模块
时间: 16:02:26
&&&& 阅读:267
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&Python里面可以通过hashlib来加密文件。hashlib可以支持多种加密,以最常见的md5为例,我们可以用来加密用户的输入密码,然后保存在数据库里。例1 加密字符串import&hashlib
obj&=&hashlib.md5(bytes(‘1111‘,&encoding=‘utf-8‘))
obj=hashlib.md5()
obj.update(bytes(‘123‘,&encoding=‘utf8‘))
obj.update(bytes(‘456‘,encoding=‘utf8‘))
result&=&obj.hexdigest()
print(obj)
print(obj.digest())
print(result)
----------------
&md5&HASH&object&@&0x101d839b0&
b‘\xe1\n\xdc9I\xbaY\xab\xbeV\xe0W\xf2\x0f\x88&‘
e10adc3949ba59abbe56e057f20f883e值得注意的有几点:首先通过hashlib.md5()生成一个对象;然后调用这个对象的方法update去生成对应的md5 checksum,然后打印出来;我对字符串‘123’,‘456’的字节分别执行了update的操作,那么最后他的md5结果和‘123456’的字节其实是一样的。通过类似的方法,我们可以把一个很大的文件分字节的读入。hexdigest()和digest()的区别 前者输出的是2进制 后者是一个16进制的摘要因为md5可以通过撞库来破解,因此可以通过 obj=hashlib.md5(bytes(‘111‘,encoding=‘utf8))再加一次密,这样撞库的几率就大为降低了。例2 加密文件import&hashlib
def&md5(fname):
&&&&hash_md5&=&hashlib.md5()
&&&&with&open(fname,&"rb")&as&f:
&&&&&&&&for&chunk&in&iter(lambda:&f.read(4096),&b""):
&&&&&&&&&&&&hash_md5.update(chunk)
&&&&return&hash_md5.hexdigest()
dd=md5(‘index.py‘)
-----------------------
06fd2a2b98ff2e333bc9861dfb8048de注意事项:因为文件可能很大,所以每次只读取4096个字节进行转换。最后返回最终的md5 checksum。注意这一句 iter()的使用,第一个参数是返回的f.read(4096)个字节码的迭代器,第二个参数b"" 表示直到这个参数才迭代结束,换句话说相当于一个循环,每次读取4096个字节码,直到为空for&chunk&in&iter(lambda:&f.read(4096),&b"")最后的MD5结果和我直接在OSX Shell里面操作是一样的jip-ise:week6&yli$&md5&index.py&
MD5&(index.py)&=&06fd2a2b98ff2e333bc9861dfb8048de本文出自 “” 博客,请务必保留此出处标签:&&&&&&&&&原文:http://beanxyz.blog.51cto.com/4933
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!玩蛇网提供最新Python编程技术信息以及Python资源下载!
您现在的位置:
Python团队修复哈希碰撞漏洞 紧急更新
Python团队修复哈希碰撞漏洞 紧急更新
Python编程语言的开发团队,在前不久已经对四个主要版本的分支进行了更新。
发布了2.6.8、2.7.3、3.1.5和3.2.3版本,这些版本主要修复了几个重要的安全漏洞。其中包括之前已经危及多个编程语言的哈希碰撞漏洞。
Python内哈希漏洞是基于和,攻击者可利用特殊的输入语句导致超长的计算时间,甚至拒绝服务,具体来说,攻击者可以通过哈希碰撞来计算成千上万的键值,这会导致构造哈希表时的二元算法复杂性。
团队为了解决这个错误,在新版本中增加了、datetime.date和datetime.date的哈希随机化功能,这可以防止攻击者计算这些类型的碰撞键值。
事实上,不接受不受信任的输入的Python应用程序不容易受到这类攻击。以上提到的Python稳定版本中,哈希随机化默认被禁用,可通过-R命令行选项,设置环境变量PYTHONHASHSEED的值为random。
这些版本还修复了expat 中的哈希安全问题,主要与Python core类型有关。现在expat库中使用的哈希算法已经被化。
玩蛇网文章,转载请注明出处和文章网址:http://www.iplaypy.com/news/a127.html
玩蛇网Python互助QQ群,欢迎加入-->:
修订日期:日 - 11时34分19秒
发布自玩蛇网
我要分享到:
必知PYTHON教程
Must Know PYTHON Tutorials
必知PYTHON模块
Must Know PYTHON Modules
最新内容 NEWS
图文精华 RECOMMEND
热点文章 HOT
玩蛇网Python QQ群 QQ Groups
o 玩蛇网Python_01群
o 玩蛇网Python_02群
o 玩蛇网Python_03群
o 玩蛇网Python_04群
o 玩蛇网Python_05群
Navigation
玩蛇网Python之家,简称玩蛇网,是一个致力于推广python编程技术、程序源码资源的个人网站。站长 斯巴达 是一位 长期关注 软件、互联网、服务器与各种开发技术的Python爱好者,建立本站旨在与更多朋友分享派森编程的乐趣!
本站团队成员: 斯巴达
欢迎加入团队...发布于 01/16 10:55
有时候爬虫爬过的url需要进行指纹核对,比如Scrapy就是进行指纹核对,如果是指纹重复则不再爬取。当然在入库的时候我还是需要做一次核对,否则如果爬虫有漏掉,进入数据库就不合适了。
根据Scrapy的指纹生成方式,这次的指纹生成方式也是用hash的MD5对目标URL进行加密,生成固定长度的字符串,然后在数据库里面将字段设置成unique,这样的话在保证url固定长度的情况下还能够保证入库后的唯一性,进最大努力避免出现重复的数据。
指纹生成代码
新建一个文件,然后在里面编写指纹生成的方法,在使用的时候from import进来,调用方法即可。代码为:
import hashlib
def get_md5(url):
由于hash不处理unicode编码的字符串(python3默认字符串是unicode)
所以这里判断是否字符串,如果是则进行转码
初始化md5、将url进行加密、然后返回加密字串
if isinstance(url, str):
url = url.encode(&utf-8&)
md = hashlib.md5()
md.update(url)
return md.hexdigest()
为了验证代码的可用性,再加上代码:
if __name__ == &__main__&:
urls = &http://www.baidus.com&
print(get_md5(urls))
在本地运行无误,再把下面这串删除。等到调用的时候from import get_md5把文件和方法引入,就可以使用了
& 著作权归作者所有
人打赏支持
码字总数 65401
后端工程师
MD5模块用于产生消息摘要,康用来判断文件是否相同。 python的md5模块使用非常简单,包括以下几个函数: md5.new([arg]) 返回一个md5对象,如果给出参数,则相当于调用了update(arg) md5.upd...
duhaizhang ?
收集常用的Python 内置的各种字符串处理 函数的使用方法 str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str) 例:print '%s length=%d' % ...
铂金胖子 ?
一、hashlib 加密模块:提供了很多加密的算法 常见的加密方式:MD5 RSA,加密之后不可逆。没法破解。 1、以MD5的方式加密字符串(Python 3) 示例 结果 2、以MD5的方式加密字符串(Python 2)...
python初雪之路 ? 04/27 ?
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等) s.strip() .lstrip() .rstrip(',') 去空格及特殊符号 复制字符串 Python 连接字符串 Pyth...
1.所有的python对象都拥有三个特性: ①身份:每个对象都有唯一的身份标识自己,可用内建函数id()来得到。基本不会用到,不用太关心 &&& a = 2&&& id(2)L&&& id(a)L 这个例子...
好好先生_1028 ?
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴...
天善智能 ? 06/25 ?
程序就是 算法 + 数据结构 Python 中,自带数据类型。常见的数据类型包括:数值类型、字符串类型、群集类型。 一、数值类型 在Python中,数值类型包括整型、浮点型、布尔型、复数型。 【1】整...
python初雪之路 ? 06/10 ?
Shell中数据类型不多,比如说字符串,数字类型,数组。数组是其中比较重要的一种,其重要应用场景,可以求数组长度,元素长度,遍历其元素,元素切片,替换,删除等操作,使用非常方便。 Sh...
孟飞阳 ? 05/28 ?
Python内置字符串操作处理方法详解 Python字符串各种操作处理的内置方法详细解释如下: str='test Word tt'
1、python 随机数生成 Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。 1.1 random.random random.random()用于生成一个0到1的随机符点数: 0 &= n & 1.0 ...
大数据之路 ?
没有更多内容
加载失败,请刷新页面
相关文章 java虚拟机之初探 java虚拟机之垃圾回收算法 当我们编写完代码后,通过编译器编译为Class文件才能被虚拟机识别而执行,而在执行这些Class文件的时候,需要把这些字节码加载到内存当...
tsmyk0715 ? 50分钟前 ?
一、递归 1.递归的定义 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法叫做递归, 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略...
aibinxiao ? 今天 ?
步骤: 1、下载 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpmrpm -ivh mysql-community-release-el7-5.noarch.rpmyum install mysql-community-server 注意......
Germmy ? 今天 ?
本人的笔记风格是,将书中的重要知识点摘抄出来,如果是特别转弯的话,本人会用自己的理解进行说明。从现在开始讲读书笔记一篇一篇的抛出来,供大家参阅学习讨论,如果错误的地方,请批评指正...
星汉 ? 今天 ?
CAS: 前言: 刚开始接触多线程的时候,听到过这个词,不过一直以为是SSO的CAS呢,后来才发现,是自己孤陋寡闻了,后来网上搜索一下,才了真正了解到CAS的魅力; 大家保证线程安全的方式都有...
yokol ? 今天 ?
HotFrameLearning 热门框架学习(前言) 一、初衷 知识是共享的,知识是大家的,本人也只是尽人事,帮助能帮助的人,将知识取之于民,用之于民。原本是想将每个点按照之前的原理分析法点...
HMILYYLIMH ? 今天 ?
linux中EOF的用法梳理 在linux运维工作中,我们会碰到这样一个场景: 执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数几行,可以使用echo进行追加,如果是多行内容,再用echo追...
河图再现 ? 今天 ?
曾经的我是一名军人,现在的我是一名java开发。2016年12月,刚刚退伍的我很是迷茫,我不知道如何规划自己的人生,因为我觉得我什么都不会,我想学习一门技术,但是又无从选择!我虽然喜欢神秘...
linux-tao ? 今天 ?
Parallel stream Fork and join Pseudocode If(task is small enough or no longer divisible){ Compute task sequentially }else{ split task in two subtasks call this method recursivel......
writeademo ? 今天 ?
Play Mongo 是一个专门为 Play Framework 开发的 MongoDB 模块,该模块提供了一个隐式方法可以简化 Play Json 的开发工作。 通常情况下,我们需要借助 Play Json 提供的Json.format宏为 case...
joymufeng ? 今天 ?
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有Python大神带你深入理解 Python 字符串Python大神带你深入理解 Python 字符串四十克拉百家号字符串字符串 (str) 存储 Unicode 文本,是不可变序列类型。相比 Python 2 里的混乱,Python 3 总算顺应时代发展,将文本和二进制彻底分离。Unicode 设计意图是为了解决跨语言和跨平台转换和处理需求,用统一编码方案容纳不同国家地区的文字,以解决传统编码方案的不兼容问题,故又称作统一码、万国码等等。Unicode 为每个字符分配一个称作码点(code point)的整数序号,此对应编码方案叫做通用字符 集(Universal Character Set, UCS)。依据编码整数长度,可分做 UCS-2 和 UCS-4 两种,后者可 容纳更多字符。UCS 只规定了字符和码点的对应关系,并不涉及如何显示和存储。UTF(Unicode Transformation Format) 的作用是将码点整数转换为计算机可存储的字节格式。 发展至今,有 UTF-8、UTF-16、UTF-32 等多种方案。其中 UTF-8 采用变长格式,因与 ASCII 兼 容,是当下使用最广泛的一种。对于英文为主的内容,UTF-8 可获得最好的存储效率。而使用两 字节等长方案的 UTF-16,有更快的处理效率,常被用作执行编码。UTF 还可在文本头部插入称作 BOM(byte order mark)的标志来标明字节序信息,以区分大小 端(BE、LE)。如此,又可细分为 UTF-16LE、UTF-32BE 等。>>> s = "汉字">>> len(s)2>>> hex(ord("汉")) # code point0x6c49>>> chr(0x6c49)汉>>> ascii("汉字") # 对 non-ASCII 进行转义。\u6c49\u5b57字符串字面量(literal)以成对单引号、双引号,或跨行三引号语法构成,自动合并相邻字面量。支持转义、八进制、十六进制,或 Unicode 格式字符。用单引号还是双引号,并没有什么特殊限制。如果文本内引用文字使用双引号,那么外面用单引号可避免转义,更易阅读。通常情况下,建议遵循多数编程语言惯例,使用双引号标示。除去单引号在英文句法里的特殊用途外,它还常用来表示单个字符。>>> "h\x69, \u6C49\U00005B57"hi, 汉字注意:Unicode 格式大小写分别表示 16 位和 32 位整数,不能混用。>>> "It's my life" # 英文缩写。>>> 'The report contained the "facts" of the case.' # 包含引文,避免使用 \" 转义。>>> "hello" ", " "world" # 合并多个相邻字量。hello, world>>> """ # 换行符、前导空格、空行都是组成内容。The Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex."""可在字面量前添加标志,指示构建特定格式字符串。最常用的原始字符串(r, raw string),它将反斜线视作字符内容,而非转义标志。这在构建类似 Windows 路径、正则表达式匹配模式 (pattern) 之类的文法字符串时很有用。>>> open(r"c:\windows\readme.txt") # Windows 路径。>>> re.findall(r"\b\d+\b", "a10 100") # 正则表达式。['100']>>> type(u"abc") # 默认 str 就是 unicode, 无需添加 u 前缀。str>>> type(b"abc") # 构建字节数组。bytes操作支持用加法和乘法运算符拼接字符串。>>> s = "hello">>> s += ", world">>> "-" * 10----------编译器会尝试在编译期直接计算出字面量拼接结果,避免运行时开销。不过此类优化程度有限,并不总是有效。>>> def test():a = "x" + "y" + "z"b = "a" * 10return a, b>>> dis.dis(test)2 0 LOAD_CONST 7 ('xyz') # 直接给出结果,省略加法运算。3 4 LOAD_CONST 8 ('aaaaaaaaaa') # 省略乘法运算。至于多个动态字符串拼接,应优先选择 join 或 format 方式。相比多次加法运算和多次内存分配 (字符串是不可变对象),join 这类函数 (方法) 可预先计算出总长度,一次性分配内存,随后直接拷贝内存数据填充。另一方面,将固定内容与变量分离的模版化 format,更易阅读和维护。>>> username = "qyuhen">>> datetime = "2017010">>> "/data/" + username + "/message/" + datetime + ".txt"/data/qyuhen/message/.txt>>> "/data/{user}/message/{time}.txt".format(user = username, time = datetime)我们用 line_profiler 对比用加法和 join 拼接 26 个大写字母的性能差异。虽然该测试不具备代表性,但可以提供一个粗略的验证方法。#!/usr/bin/env python3import stringx = list(string.ascii_uppercase)@profiledef test_add():s = ""for c in x:s += creturn sdef test_join():return "".join(x)test_add()test_join()输出:$ kernprof -l ./test.py && python -m line_profiler test.py.lprof编写代码除保持简单外,还应具备良好的可阅读性。比如判断是否包含子串,in、not in 操作符就比 find 方法自然,更贴近日常阅读习惯。>>> "py" in "python"True>>> "Py" not in "python"作为序列类型,可以使用索引序号访问字符串内容,单个字符或者某一个片段。支持负索引,也就是从尾部以 -1 开始(索引 0 表示正向第一个字符)。>>> s = "">>> s[2]>>> s[-1]9>>> s[2:6]2345>>> s[2:-2]234567使用两个索引号表示一个序列片段的语法称作切片(slice),可以此返回字符串子串。但无论以哪种方式返回与原字符串内容不同的子串时,都会重新分配内存,并复制数据。不像某些语言那样,仍旧以指针引用原字符串内容缓冲区。先看相同或不同内容时,字符串对象构建情形。>>> s = "-" * 1024>>> s1 = s[10:100] # 片段,内容不同。>>> s2 = s[:] # 内容相同>>> s3 = s.split(",")[0] # 内容相同。>>> s1 is s # 内容不同,构建新对象。False>>> s2 is s # 内容相同时,直接引用原字符串对象。>>> s3 is s再进一步用 memory_profiler 观察内存分配情况。def test():a = x[10:-10]b = x.split(",")x = "0," * (1 << 20)test()输出$ python -m memory_profiler ./test.py此类行为,与具体的 Python 实现版本有关,不能一概而论。字符串类型内置丰富的处理方法,可满足大多数操作需要。对于更复杂的文本处理,还可使用正则表达式(re)或专业的第三方库,比如 NLTK、TextBlob 等。转换除去与数字、Unicode 码点的转换外,最常见的是在不同编码间进行转换。Python 3 使用 bytes、bytearray 存储字节数组,不再和 str 混用。>>> b = s.encode("utf-16") # to bytes>>> b.decode("utf-16") # to unicode string汉字如要处理 BOM 信息,可导入 codecs 模块。>>> s.encode("utf-16").hex()fffe496c575b>>> codecs.BOM_UTF16_LE.hex() # BOM 标志。fffe>>> codecs.encode(s, "utf-16be").hex() # 按指定 BOM 转换。6c495b57>>> codecs.encode(s, "utf-16le").hex()496c575b还有,Python 3 默认编码不再是 ASCII,所以无需额外设置。Python 3.6>>> sys.getdefaultencoding()utf-8Python 2.7>>> import sys>>> reload(sys)>>> sys.setdefaultencoding("utf-8")>>> b = s.encode("utf-16")>>> b.decode("utf-16")u'\u6c49\u5b57'>>> type(b)格式化长期发展下来,Python 累积了多种字符串格式化方式。相比古老的面孔,人们更喜欢或倾向于使用新的特征。Python 3.6 新增了 f-strings 支持,这在很多脚本语言里属于标配。使用 f 前缀标志,解释器解析大括号内的字段或表达式,从上下文名字空间查找同名对象进行值替换。格式化控制依旧遵循 format 规范,但阅读体验上更加完整和简洁。>>> x = 10>>> y = 20>>> f"{x} + {y} = {x + y}" # f-strings10 + 20 = 30>>> "{} + {} = {}".format(x, y , x + y)表达式除运算符外,还可以是函数调用。>>> f"{type(x)}"完整 format 格式化以位置序号、字段名匹配替换值参数,允许对其施加包括对齐、填充、 精度等控制。从某种角度看,f-strings 有点像是 format 的增强语法糖。将两者进行对比,f-strings 类模版方式更加灵活,一定程度上将输出样式与数据来源分离。 但其缺点是与上下文名字耦合,导致模版内容与代码必须保持同步修改。而 format 的序号与主键匹配方式可避开这点,只可惜它不支持表达式。另外,对于简短的格式化处理,format 拥有更好的性能。手工序号和自动序号>>> "{0} {1} {0}".format("a", 10)a 10 a>>> "{} {}".format(1, 2) # 自动序号,不能与手工序号混用。1 2主键>>> "{x} {y}".format(x = 100, y = [1,2,3])100 [1, 2, 3]属性和索引>>> x.name = "jack">>> "{0.name}".format(x) # 对象属性。jack>>> "{0[2]}".format([1,2,3,4]) # 索引。3宽度、补位>>> "{0:#08b}".format(5)0b000101数字>>> "{:06.2f}".format(1.234) # 保留 2 位小数。001.23>>> "{:,}".format() # 千分位。123,456,789对齐>>> "[{:^10}]".format("abc") # 居中[ abc ]>>> "[{:.<10}]".format("abc") # 左对齐,以点填充。[abc.......]古老的 printf 百分号格式化方式已被官方标记为 “obsolete”,加上其自身固有的一些问题,可能会被后续版本抛弃,不建议使用。另外,标准库里 string.Template 功能弱,且性能也差,同样不建议使用。池化字符串算是进程里实例数量较多的类型之一,因为无处不在的名字就是字符串实例。鉴于相同名字会重复出现在各种名字空间里,那么有必要让它们共享对象。内容相同,且不可变,共享不会导致任何问题。关键是可节约内存,且省去创建新实例的调用开销。对此,Python 的做法是实现一个字符串池(intern)。池负责管理实例,使用者只需引用即可。另一潜在好处是,从池返回的字符串,只需比较指针就可知道内容是否相同,无需额外计算。可用来提升哈希表等类似结构的查找性能。>>> "__name__" is sys.intern("__name__")除了以常量方式出现的名字和字面量外,动态生成字符串一样可加入池中。如此可保证每 次都引用同一对象,不会有额外的创建和分配操作。>>> a = "hello, world!">>> b = "hello, world!">>> a is b # 不同实例。>>> sys.intern(a) is sys.intern("hello, world!") # 相同实例。当然,一旦失去所有外部引用,池内字符串对象会被回收。>>> a = sys.intern("hello, world!")>>> id(a)>>> id(sys.intern("hello, world!")) # 有外部引用。>>> del a # 删除外部引用后被回收。>>> id(sys.intern("hello, world!")) # 从 id 值不同可以看到新建,入池。字符串池实现算法很简单,就是简单的字典结构。 详情参考 Objects/unicodeobject.c : PyUnicode_InternInPlace。做大数据处理时,可能需创建海量主键,使用 intern 有助于减少对象数量,节约大量内存。本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。四十克拉百家号最近更新:简介:关注手机数码、智能硬件等消费电子类产品。作者最新文章相关文章python中string的hash函数为什么选择这个_百度知道
python中string的hash函数为什么选择这个
我有更好的答案
字符串hash算法有很多,为什么用这个不用其他呢,也许只是随便挑了一个性能过得去的。如果解决了您的问题请采纳!如果未解决请继续追问
为您推荐:
其他类似问题
您可能关注的内容
hash函数的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 哈希字符串比较 的文章

 

随机推荐