Python哈希函数示例| Python hash()方法教程
Python哈希函数示例| Python hash()方法教程是今天的主题。 hash()方法返回对象的哈希值(如果有)。散列值只是整数,用于在字典查找过程中快速比较字典键。简单来说,散列是一个固定大小的整数,它标识一个特定的值。请注意,上面的定义是最简单的解释。
让我们指出什么是固定哈希可以意味着什么?请参阅以下几点。
- 相同的数据将具有相同的哈希值。
- 即使原始数据的微小变化也可能导致完全不同的散列值。
- 哈希是从哈希函数获得的,哈希函数的职责是将一条给定信息转换为编码哈希。
- 许多对象可能远远多于多个散列值,因此,两个对象可以散列到相同的散列值。它被称为哈希碰撞。这意味着如果两个对象具有相同的哈希码,则它们不一定具有相同的值。
- 使用hash()散列的对象是不可逆转的,导致信息丢失。
- hash()方法仅为不可变对象返回散列值,因此可用作检查可变/不可变对象的指示符。
内容概述
- 1 Python Hash函数示例
- 1.1 hash()语法
- 2从hash()返回值
- 3 hash()如何在Python中工作
- 4 Python hash()String
- 5如何为自定义对象定义hash()函数
- 6为什么可变对象不能被哈希
Python哈希函数示例
一个好的哈希函数是导致冲突次数最少的一个函数,这意味着,没有两组信息应该具有相同的哈希值。
在内部,hash()方法调用对象的__hash __()方法,该方法默认为任何对象设置。我们稍后会看到这个。
当完成字典键的比较时,散列码是最常用的。
当对特定键进行字典查找时,比较字典键的哈希码。比较散列比比较总键值要快得多,因为散列函数映射每个字典键的整数集比一组对象本身小得多。
hash()语法
请参阅以下Hash方法语法。
散列(对象)
object参数,返回其哈希值(整数,字符串,浮点数)。
请参阅以下示例代码。
#app.py tuple_value =(21,19,18,46,29)#tuples is immutable list_value =(11,21,31,41,51)#list是mutable print(“元组哈希值是:”+ str (hash(tuple_value)))print(“列表哈希值为:”+ str(hash(list_value)))
见下面的输出。
元组是一个不可变对象,我们可以从元组创建哈希值。
列表是一个可变对象,这就是它抛出错误的原因,就像我们可以将列表转换为哈希一样。该列表是不可用的类型。
从hash()返回值
hash()函数返回对象的哈希值(如果有)。如果对象具有自定义__hash __()方法,则会将返回值截断为Py_ssize_t的大小。
hash()如何在Python中工作
请参阅python中的以下哈希示例。
#app.py value = 1921 print(“整数散列值为:”,散列(值))valueA = 19.21 print(“浮点散列值为:”,散列(valueA))
在上面的代码中,我们采用了两种数据类型。
- 整数
- 浮动
现在,整数的散列本身就是整数,但浮点数的散列有些不同。见下面的输出。
Python hash()String
让我们开始构建hash()方法可能有益的简单示例和场景。在这个例子中,我们将获得String的哈希值。
#app.py app =“Instagram”hash1 = hash(app)hash2 = hash(app)print(“Hash 1:%s”%hash1)print(“Hash 2:%s”%hash2)
见下面的输出。
两个输出都是相同的,因为我们对哈希使用了相同的字符串。
如果您重新运行相同的脚本,哈希更改,这是一个重要的问题,如下所示。
如何为自定义对象定义hash()函数
在内部,hash()函数通过覆盖__hash()__函数来工作。
值得注意的是,并非每个对象都是可清除的(可变集合不可清除)。
我们还可以为自定义类定义__hash __()函数。这就是我们现在要做的。在此之前,让我们指出一些基本要点。
请参阅以下示例。
- 不应对可变集合进行Hashable实现,因为集合的密钥对于散列应该是不可变的。
- 我们不必定义自定义__eq()__函数实现,因为它是为所有对象定义的。
请参阅以下代码示例。
#app.py class Employee:def __init __(self,empno,name):self.empno = empno self.name = name def __eq __(self,other):return self.empno == other.empno and self.name == other.name def __hash __(self):return hash((self.empno,self.name))employee = Employee(21,'Krunal')print(“hash is:%d”%hash(employee))
请参阅以下输出。
对象的自定义哈希实现的情况。
__eq __() | __hash __() | 描述 |
---|---|---|
定义(默认) | 定义(默认) | 如果保持原样,则所有对象都不相等(除了它们自己) |
(如果可变)定义 | 不应该定义 | hashable集合的实现要求key的hash值是不可变的 |
没有定义的 | 不应该定义 | 如果未定义__eq __(),则不应定义__hash __()。 |
定义 | 没有定义的 | 类实例不能用作可散列集合。
__hash __()隐式设置为None 如果尝试检索哈希,则引发TypeError异常。 |
定义 | 保留父母 | __hash__ = |
定义 | 不想哈希 | __hash__ =无
如果尝试检索哈希,则引发TypeError异常。 |
为什么可变对象不能被哈希
正如我们已经知道的那样,只能对一个不可变对象进行哈希处理。不允许对可变对象进行散列的这种限制大大简化了散列表。让我们理解如何。
如果允许对可变对象进行哈希处理,则每次更新对象的值时都需要更新哈希表。这意味着我们必须将对象移动到完全不同的桶中。这是一项非常昂贵的操作。
在Python中,我们有两个使用哈希表,字典和集合的对象:
- 字典是哈希表,称为关联数组。在字典中,只有键被散列而不是值。这就是为什么字典键应该是不可变对象的原因,而值可以是任何东西,甚至是可变的列表。
- 该集包含可清除的唯一对象。如果我们有不可清洗的项目,我们不能使用该集合,而必须使用列表。
最后,Python哈希函数示例| Python hash()方法教程结束了。