-1
  • immutable 和 hash-able 和有什么区别?
  • 这是什么意思“如果一个对象的哈希值在其生命周期内永远不会改变,那么它是可哈希的?”
  • 元组是不可变和可散列的还是仅不可变的?为什么 ?
4

3 回答 3

3

散列是一些散列算法对一大块数据的应用;通常是一种将其压缩为可在哈希查找表中搜索的小得多的值的方法。散列的一些示例包括MD5SHA-2

一些散列在产生冲突时被认为是“失效的”——这意味着两个非常不同的数据会产生相同的“压缩”字符串或整数。MD5 已失效,因为存在冲突,但大多数 SHA-2 变体没有。

不变性是确保某些东西不会改变的过程。例如,想象一个 C 程序的静态二进制文件。一旦将其发布到万维网或最终用户,您不希望其内容发生变化,因此您希望它是不可变的。

这与散列有关。一旦你“散列”了一个对象,你就不希望它的内容改变,否则你会得到一个不同的散列。如果你改变了内容并且哈希没有改变,那么你就会发生冲突!

元组只是一种数据结构,应该是不可变的和可散列的。如果您在执行此操作时遇到问题,则可能是代码问题。

于 2019-05-15T17:30:11.023 回答
3
  1. 不可变意味着对象,即项目的顶级容器,不能更改。请注意,这仅适用顶层;它可能包含对可变子对象的引用。

  2. Hashable有一个函数定义:Python 的内置hash函数返回一个值。这通常意味着对象的闭包(在所有对其叶节点值的引用之后)由不可变对象组成。

  3. 您的前提不正确:元组可以包含可变项。任何此类引用都会使元组不可散列。

例如:

>>> b = [7]
>>> a = (b, 5)
>>> a
([7], 5)
>>> type(a)
<class 'tuple'>
>>> set(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> b[0] = 'b'
>>> a
(['b'], 5)

b是一个可变列表。对的引用可以b保存在元组中a。我们可以改变b[0]不是它的对象句柄)的值,以及改变的显示值a。但是,我们不能创建包含 的集合a,因为b呈现不可散列的可变性a

继续示例:

>>> b = False
>>> a
(['b'], 5)
>>> b = [14]
>>> a
(['b'], 5)

a是不可变的。因此,当我们更改 时b,只会b获取对新对象的引用。 a保留原始对象句柄,仍然指向['b'].

于 2019-05-15T17:37:38.877 回答
2
  1. Hashable 意味着一个对象可以被散列(与hash()函数一起使用时会产生一个值,而 immutable 意味着一个对象不能被“变异”或改变。它们往往一起出现,因为可变参数将是可怕的字典键(它们每次更改时都会更改其哈希值)
  2. 如果一个项目具有与 相关联的永远不变的值hash(item),则它是可散列的
  3. 元组既不可变又可散列
于 2019-05-15T17:28:39.120 回答