精华内容
下载资源
问答
  • Python中的哈希

    2019-11-09 09:15:51
    对于这个整数我们需要了解,这个整数在一个Python进程中是唯一而且保持不变,但它们值在重复运行 Python不可预测。那么我们可以根据这个哈希值搭建很多以此为依据数据类型-称...

    基础

    1、什么是可哈希(hashable)?哪些类型是可哈希的?

    参考 python可变与可哈希

    2、Python的哈希值和哈希集

    Python内置了hash()方法,能够返回可哈希对象的哈希值(一个整数)。对于这个整数我们需要了解,这个整数在一个Python进程中是唯一而且保持不变的,但它们的值在重复运行的 Python 间是不可预测的。那么我们可以根据这个哈希值搭建很多以此为依据的数据类型-称为哈希集。Pyhotn中的哈希集有set、frozenset、dict
    对于哈希集中的对象一定都是可哈希的,比如字典的KEY不能够是列表,因为列表不可哈希,同时集合的元素不能够包含列表,字典,以及集合。

    默认自定义类

    用户自定义的类默认带有__eq__()和__hash__()方法。默认使它们与任何(自己除外)对象必定不同,意思是x.hash()会返回一个恰当的值确保 x==y 同时 x is y 同时 hash(x) == hash(y)

    重载__hash__(self)

    Python内置的hash()方法调用的就是__hash__()魔法方法,根据官方建议:it is advised to mix together the hash values of the components of the object that also play a part in comparison of objects by packing them into a tuple and hashing the tuple.最大化使用对象中有哈希值的成员构成的元组,并返回元组的哈希值。这里有一个官方的实例:

    def __hash__(self):
    	return hash((self.name, self.nick, self.color))
    

    只重载__eq__()

    如果一个用户自定义类只重载了__eq__()而没有重载__hash__()则会将其__hash__()隐式的设置为None。当一个类的__hash__()为None时,该类的实例将在一个程序尝试获取其哈希值时正确的引发TypeError,并会在检测isinstance(obj, collections.abc.Hashable)时被正确的识别为不可哈希对象。

    # 1、可哈希自定义类
    class A(object):
    	pass
    
    class B(object):
    	
    	def __init__(self, value1, value2):
    		slef.value1 = value1
    		self.value2 = value2
    	
    	def __eq__(self, other):
    		if isinstance(other, self.__class__):
    			if self.value1 == other.value1 and self.value2 == other.value2:
    				return True
    		return False
    
    	def __hash__(self):
    		return hash((self.value1, self.value2))
    # 2、不可哈希自定义类(隐式)
    class C(object):
    	
    	def __init__(slef, value1, value2):
    		self.value1 = value1
    		slef.value2 = value2
    
    	def __eq__(self, other):
    		if isinstance(other, self.__class__):
    			if self.value1 == other.value1 and self.value2 == other.value2:
    				return True
    		return False
    
    >>> c = C(1, 2)
    >>> isinstance(c, collections.abc.Hashable)
    >>> False # 因为只重载__eq__方法,__hash__被隐式置为None,尝试访问其哈希值时会抛出异常
    # 3、显式定义不可哈希类
    class D(object):
    	def __init__(slef, value1, value2):
    		self.value1 = value1
    		slef.value2 = value2
    
    	def __eq__(self, other):
    		if isinstance(other, self.__class__):
    			if self.value1 == other.value1 and self.value2 == other.value2:
    				return True
    		return False
    
    	def __hash__(self):
    		return hash((self.value1, self.value2))
    
    >>> d = D(1, 3)
    >>> isinstance(d, collections.abc.Hashable))
    >>> True
    
    展开全文
  • python中的hashable(可哈希的)是什么意思

    万次阅读 多人点赞 2018-12-29 23:29:36
    不严谨但易懂解释: ...在Python中: list、set和dictionary 都可改变,比如可以通过list.append(),set.remove(),dict['key'] = value对其进行修改,所以它们都不可哈希的; 而tup...

    不严谨但易懂的解释:

    一个对象在其生命周期内,如果保持不变,就是hashable(可哈希的)。

    hashable ≈ imutable     可哈希 ≈ 不可变

    在Python中:

    list、set和dictionary 都是可改变的,比如可以通过list.append(),set.remove(),dict['key'] = value对其进行修改,所以它们都是不可哈希的

    而tuple和string是不可变的,只可以做复制或者切片等操作,所以它们就是可哈希的

     

    官方解释:

    An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() or __cmp__() method). Hashable objects which compare equal must have the same hash value.

    Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.

    All of Python’s immutable built-in objects are hashable, while no mutable containers (such as lists or dictionaries) are. Objects which are instances of user-defined classes are hashable by default; they all compare unequal, and their hash value is their id().

    大致翻译一下:

    如果一个对象在其生命周期内,其哈希值从未改变(这需要一个__hash__()方法),并且可以与其他对象进行比较(这需要一个__eq__()或__cmp__()方法),那么这个对象就是可哈希的。哈希对象的相等意味着其哈希值的相等。

    哈希性使得对象可以用作dictionary键和set成员,因为这些数据结构在内部使用了哈希值。

    Python的所有不可变的内置对象都是可hashable的,但可变容器(如列表或字典)并非如此。对于用户定义的类的实例,默认情况下是可哈希的;它们都是不相等的,并且它们的哈希值都是id()。

    展开全文
  • Python中hashable和immutable 初学Python,我们清楚元组对象是不可变(immutable),字典键必须是可以哈希的(hashable)。这一讲我们就来好好聊聊这两个概念到底是什么意思。 1. 可变与不可变 首先明确可变与不...

    Python中hashable和immutable

    初学Python,我们清楚元组对象是不可变的(immutable),字典的键必须是可以哈希的(hashable)。这一讲我们就来好好聊聊这两个概念到底是什么意思。

    1. 可变与不可变

    首先明确可变与不可变对象,我们默认的是Python的内置对象。自定义的对象我们不去讨论,毕竟Python是一门动态语言,需要的话我们随时可以改变自定义对象的可变性。

    Python内置的不可变对象有数字类型、字符串类型、元组等,Python内置的可变对象有列表、字典、集合等。我们是依据什么把其中的一些对象归于可变,又把另一些归于不可变的呢?依据很简单:当改变一个对象的值,如果其id值不变,那么对象是可变类型,反之对象为不可变类型

    2. 可哈希对象

    先来看一下官方文档上面对hashable的说明:

    如果一个对象在其生命周期内有一个固定不变的哈希值 (这需要__hash__()方法) 且可以与其他对象进行比较操作 (这需要__eq__()方法) ,那么这个对象就是可哈希对象 (hashable) 。可哈希对象必须有相同的哈希值才算作相等。

    由于字典 (dict) 的键 (key) 和集合 (set) 内部使用到了哈希值,所以只有可哈希 (hashable) 对象才能被用作字典的键和集合的元素。

    所有python内置的不可变对象都是可哈希的,同时,可变容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。用户自定义的类的实例默认情况下都是可哈希的;它们跟其它对象都不相等 (除了它们自己) ,它们的哈希值来自id()方法。

    补充下对象的id值与哈希值之间的关系。首先要知道的是在id值相同的情况下,哈希值必然相同。id唯一确定一个对象,同一个对象哈希值也是唯一的。然后,在id不同的情况下哈希值通常不同,但这个在Python内置的对象里是可以有例外的。

    3. 小结

    可变与不可变的依据是对象的在Python进程中唯一的ID,可哈希依据的是__hash__和__eq__方法,内置Python基本类型不可变类型都是可哈希的,而可变类型都是不可哈希的。

    展开全文
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有... Python中的MD5哈希 与md5相关的功能 示例1:在Python中打印等效于MD5哈希的字节 示例2:在Python中打印MD5哈希的十六进制等效项

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    python免费学习资料、代码以及群交流解答点击即可加入


    在本文中,我们将学习Python中的MD5加密,并详细讨论其含义和用法。包括以下内容:

    • 什么是MD5?
    • Python中的MD5哈希
    • 与md5相关的功能
    • 示例1:在Python中打印等效于MD5哈希的字节
    • 示例2:在Python中打印MD5哈希的十六进制等效项
    • 示例3:Python MD5文件校验
    • 输出与说明
    • 示例4:使用Python在MD5中编码字符串
    • 输出与说明
    • 示例5:在Python中计算文件的MD5哈希
    • 输出与说明
    • 应用范围
    • 优点
    • 缺点
    • 结论

    什么是MD5?

    MD5代表消息摘要算法。它是一个哈希函数,可产生128位哈希值。可用作校验和验证数据完整性。它适用于非加密目的,例如确定分区数据库中特定密钥的分区。

    Python中的MD5哈希:

    该哈希函数在Python的hashlib模块中可用。它以字节序列作为输入,并返回128位哈希值作为输出。散列函数的主要用途是检查数据完整性,但存在安全性问题。

    与md5相关的功能:

    • encode():将字符串转换为字节
    • digest(): 以字节格式返回编码数据
    • hexdigest():以十六进制格式返回编码的数据

    示例1:在Python中打印等效于MD5哈希的字节

    import hashlib 
     
    result = hashlib.md5(b'Python Pool') 
    print("Hash Value : ", end ="")
    print(result)
    print("Equivalent Byte : ", end ="") 
    print(result.digest()) 
    

    输出和说明:

     

    在此代码中,我们采用字节输入,这是哈希函数可接受的。然后,我们使用md5哈希函数对该值进行编码。最后,我们使用digest()函数生成了编码字符串的等效字节。

    示例2:在Python中打印MD5哈希的十六进制等效项

    import hashlib 
     
    result = hashlib.md5('Python Pool'.encode()) 
    print("Hash Value : ", end ="")
    print(result)
    print("Hexadecimal Equivalent : ", end ="") 
    print(result.hexdigest()) 
    

    输出和说明:

     

    在这里,我们使用encode()函数将字符串转换为等效的字节,从而使其被哈希函数接受。然后,我们使用md5函数对其进行编码,最后,使用hexdigest()函数显示其十六进制等效项。

    示例3:Python MD5文件校验

    md5_hash = hashlib.md5()
     
    file = open("test.txt", "rb")
    content = file.read()
    md5_hash.update(content)
     
    result = md5_hash.hexdigest()
    print(result)
    

    输出和说明:

     

    在此代码中,调用hashlib.md5()函数以创建MD5对象。我们以“ rb”模式打开了一个文件,其中rb代表“ read bytes”。使用read()方法,我们将文件的内容读取到一个变量中。update()方法更新文件内容。最后,使用hexdigest()方法,我们将哈希值转换为等效的十六进制值。

    示例4:使用Python在MD5中编码字符串

    import hashlib 
    string = "pythonpool.com"
    encoded=string.encode()
    result = hashlib.md5(encoded)
    print("String : ", end ="")
    print(string)
    print("Hash Value : ", end ="")
    print(result)
    print("Hexadecimal equivalent: ",result.hexdigest())
    

    输出和说明:

     

    在此示例中,我们使用hashlib.md5()函数将字符串值编码为哈希值。然后,我们使用hexdigest()方法来获取生成的哈希值的十六进制等效项。同样,我们也可以使用digest()方法来获取与生成的哈希值等效的字节。

    示例5:在Python中计算文件的MD5哈希

    import hashlib
     
    with open("sample.txt","rb") as f:
        bytes = f.read()
        print("Bytes read from the file:",bytes)
        result = hashlib.md5(bytes)
        print("Hah Value: ",result)
        print("The hexadecimal equivalent: ")
        print(result.hexdigest())
    

    输出和说明:

     

    在此代码中,我们首先创建了一个示例文本文件。然后,我们以字节为单位读取该文件的内容。我们将字节转换为哈希值,然后最终看到相同的十六进制等效项。

    应用范围:

    • 在软件中使用,以确保传输的文件完整无缺
    • 通过为在法律发现过程中交换的每个文档提供唯一的标识符,它也可用于电子发现(对可能涉及到诉讼相关的电子证据的归档和再现)
      优点
    • 提供一个任意大小的安全输入(如果使用128位,则可以产生输出)
    • 原始消息的消息摘要的生成非常简单
    • 可以执行具有任意位数的消息的消息摘要
      缺点
    • 容易出现哈希冲突的弱点
    • 没有提供针对这些碰撞攻击的安全性
    • 与优化的SHA算法相比,速度相当慢

    总结

    在本文中,我们讨论了python中的md5哈希函数。我们看到了相同的各种示例,还了解了它的各种应用。

    展开全文
  • 什么是哈希(hashable)? 简要说可哈希的数据类型,即不可变数据结构(字符串str、元组tuple、对象集objects)。  哈希有啥作用? 它一个将大体量数据转化为很小数据过程,甚至可以仅仅一个数字...
  • 前言:我们经常会听见很多概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多概念后面到底又有什么区别和联系,它们本质又怎么样,本此系列文章将针对这些概念进行...
  • 详解Python中的哈希对象与不可哈希对象(二)

    千次阅读 多人点赞 2019-10-30 16:49:52
    前言:我们经常会听见很多概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多概念后面到底又有什么区别和联系,它们本质又怎么样,本此系列文章将针对这些概念进行...
  • 1、什么是哈希的(hashable)和不该改变(imutable)? 如果一个对象在自己生命周期有一哈希值(hash value)不可改变,那么它就是可哈希的(hashable),因为这些数据结构内置了哈希值,每个可哈希的...
  • 字典是python语言唯一的映射类型映射类型对象里哈希值(键,key)和指向的对象(值,value)一对多的广西,通常被认为可变的哈希表字典对象可变的,它一个容器类型,能存储任意个数的python对象,其中也包括其他...
  • 字典是python中唯一映射类型,采用键值对(key-value)形式存储数据。python对key进行哈希函数运算,根据计算结果决定value存储地址,所以字典无序存储,且key必须哈希的。可哈希表示key必须不可...
  • 哈希算法又称散列函数算法,一种查找算法,应该说哈希算法最快查找算法,没有之一。对于查找问题,哈希算法一直首选算法。那么,为什么名字起这么“嘻哈”算法会如此强大,本 Chat 将为你揭开谜底。 ...
  • 哈希哈希函数从一个给定数据计算出来哈希函数H和数据v满足如下要求: 1、需要有一个函数(通常等号)来判断v1和v2是否相等。这里相等指逻辑上。譬如说你实现一个分数struct,那么只要他们约分...
  • 有一个元素序列,想知道在序列中出现次数最多的元素是什么 解决方案 collections 模块中的 Counter 类转让给女士为此问题所设计的。它甚至有一个非常方便的most_common()方法可以直接告诉我们答案。 为了说明用法...
  • 一个 python 脚本,它将自动查找包含在virustotal.com 目录中的所有文件。 我写这个为了快速检查我的 rasbperry pi 上的便携式媒体是否有已知病毒。 用法 python arethesebad.py ../Directory/To/Scan python ...
  • Python中字典key都可以是什么

    万次阅读 多人点赞 2018-07-24 22:04:07
    所以所有python自带类型,除了list、dict、set和内部至少带有上述三种类型之一tuple之外,其余对象都能当key。 比如数值/字符串/完全不可变元祖/函数(内建或自定义)/类(内建或自定义)/方法/包等等你能拿出...
  • 这部分由于Python的本性,它以PyObjects形式将数据保存在RAM,而PyObjects消耗内存比Integers和Character Arrays等本机类型要多得多。因此,在构建占用大量内存的python应用程序时,Python字典在许多情况下...
  • 2020.7.29:一起Python零基础走天下哈 ...1. 在python3,即使包下没有init.py文件,import 包仍然不会报错,而在python2,包下一定要有该文件,否则import 包报错  2. 创建包目的不是为了运行,而是被导入使用,
  • Python哈希查找,构建简单哈希

    万次阅读 2016-06-28 16:57:20
    说实话上学期学完数据结构与算法这门课,...过程中了解到了hash的很多在redis(更早 在Memcached:一个高性能的分布式内存对象缓存系统)中的应用,然后就是各种牛逼,各种应用,我才返回去看到底hash什么东西….
  • 什么是哈希的(hashable)不该改变(imutable)? 如果一个对象在自己生命周期有一哈希值(hash value)不可改变,那么它就是可哈希的(hashable),因为这些数据结构内置了哈希值,每个可哈希的...
  • 如果一个对象在自己生命周期中有一哈希值(hash value)不可改变,那么它就是可哈希的(hashable),因为...所有python中所有不可改变的的对象(imutableobjects)都哈希的,比如字符串,元组,也就是说...
  • :link:不知道它是什么类型的哈希? 命名哈希将命名该哈希类型! :robot:识别MD5,SHA256和3000多种其他哈希值with附带一个简洁的Web应用程序:right_arrow:Discord| 网站:left_arrow:现代哈希识别系统pip3无需安装...
  • 是什么哈希足够好? 一个好视觉散​​列应该具有以下属性: 以香农熵衡量高信息含量。 这会导致散列冲突可能性很小。 这提供了前映像抗性,即它使得难以创建导致与给定散列相同散列第二输入。 一个高...
  • python中的字典

    2019-02-26 21:09:00
    python中的数据类型可以划分为可变数据类型和不可变数据类型,可变数据类型就是可以哈希的数据类型,不可变数据类型就是不可哈希的数据类型。(不太懂什么是哈希,似乎一种技术处理数据使得数据便于处理) 不可变...
  • 映射类型对象里哈希值(键,key)和指向的对象(值,value)一对多的的关系,通常被认为可变的哈希表。 字典对象可变的,它一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。 字典类型...
  • Python中的字典介绍

    2017-12-18 21:33:00
    映射类型对象里哈希值(键,key)和指向的对象(值,value)一对多的广西,通常被认为可变的哈希表 字典对象可变的,它一个容器类型,能存储任意个数的python对象,其中也包括其他容器类型。 字典类型与序列类型...
  • Python中的pass是什么?Pass是一个在Python中不会被执行的语句。在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符。数组和元组之间的区别是什么?数组内容是可以被修改的。元组内容是只读的。元组可以...
  • 7、python中的字典

    2018-06-14 20:05:00
    这也什么字典中的键必须不可变的数据类型(如字符串、数字等),如果键发生了变化,哈希计算的结果也会发生变化,这时会分配一个新的内存地址,而储存在原来内存地址的值也就找不出来了。 一、如何创...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 260
精华内容 104
关键字:

python中的哈希是什么

python 订阅