Python哈希函数示例| Python hash()方法教程


Python哈希函数示例| Python hash()方法教程是今天的主题。 hash()方法返回对象的哈希值(如果有)。散列值只是整数,用于在字典查找过程中快速比较字典键。简单来说,散列是一个固定大小的整数,它标识一个特定的值。请注意,上面的定义是最简单的解释。

让我们指出什么是固定哈希可以意味着什么?请参阅以下几点。

  1. 相同的数据将具有相同的哈希值。
  2. 即使原始数据的微小变化也可能导致完全不同的散列值。
  3. 哈希是从哈希函数获得的,哈希函数的职责是将一条给定信息转换为编码哈希。
  4. 许多对象可能远远多于多个散列值,因此,两个对象可以散列到相同的散列值。它被称为哈希碰撞。这意味着如果两个对象具有相同的哈希码,则它们不一定具有相同的值。
  5. 使用hash()散列的对象是不可逆转的,导致信息丢失。
  6. 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)))

见下面的输出。

Python哈希函数示例

元组是一个不可变对象,我们可以从元组创建哈希值。

列表是一个可变对象,这就是它抛出错误的原因,就像我们可以将列表转换为哈希一样。该列表是不可用的类型。

从hash()返回值

hash()函数返回对象的哈希值(如果有)。如果对象具有自定义__hash __()方法,则会将返回值截断为Py_ssize_t的大小。

hash()如何在Python中工作

请参阅python中的以下哈希示例。

#app.py value = 1921 print(“整数散列值为:”,散列(值))valueA = 19.21 print(“浮点散列值为:”,散列(valueA))

在上面的代码中,我们采用了两种数据类型。

  1. 整数
  2. 浮动

现在,整数的散列本身就是整数,但浮点数的散列有些不同。见下面的输出。

hash()如何在Python中工作

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)

见下面的输出。

Python hash()String

两个输出都是相同的,因为我们对哈希使用了相同的字符串。

如果您重新运行相同的脚本,哈希更改,这是一个重要的问题,如下所示。

Python hash()方法教程

如何为自定义对象定义hash()函数

在内部,hash()函数通过覆盖__hash()__函数来工作。

值得注意的是,并非每个对象都是可清除的(可变集合不可清除)。

我们还可以为自定义类定义__hash __()函数。这就是我们现在要做的。在此之前,让我们指出一些基本要点。

请参阅以下示例。

  1. 不应对可变集合进行Hashable实现,因为集合的密钥对于散列应该是不可变的。
  2. 我们不必定义自定义__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)) 

请参阅以下输出。

如何为自定义对象定义hash()函数

对象的自定义哈希实现的情况。

对象的哈希实现

__eq __() __hash __() 描述
定义(默认) 定义(默认) 如果保持原样,则所有对象都不相等(除了它们自己)
(如果可变)定义 不应该定义 hashable集合的实现要求key的hash值是不可变的
没有定义的 不应该定义 如果未定义__eq __(),则不应定义__hash __()。
定义 没有定义的 类实例不能用作可散列集合。

__hash __()隐式设置为None

如果尝试检索哈希,则引发TypeError异常。

定义 保留父母 __hash__ = .__ hash__
定义 不想哈希 __hash__ =无

如果尝试检索哈希,则引发TypeError异常。

为什么可变对象不能被哈希

正如我们已经知道的那样,只能对一个不可变对象进行哈希处理。不允许对可变对象进行散列的这种限制大大简化了散列表。让我们理解如何。

如果允许对可变对象进行哈希处理,则每次更新对象的值时都需要更新哈希表。这意味着我们必须将对象移动到完全不同的桶中。这是一项非常昂贵的操作。

在Python中,我们有两个使用哈希表,字典和集合的对象:

  • 字典是哈希表,称为关联数组。在字典中,只有键被散列而不是值。这就是为什么字典键应该是不可变对象的原因,而值可以是任何东西,甚至是可变的列表。
  • 该集包含可清除的唯一对象。如果我们有不可清洗的项目,我们不能使用该集合,而必须使用列表。

最后,Python哈希函数示例| Python hash()方法教程结束了。

资讯来源:由0x资讯编译自APPDIVIDEND,版权归作者Krunal所有,未经许可,不得转载
你可能还喜欢