【问题标题】:Towards understanding dictionaries理解字典
【发布时间】:2016-09-03 04:19:57
【问题描述】:

我需要使用多个哈希表,所以在 中,我通常会使用std::unordered_map。到目前为止,我可以理解我可以在 Python 中使用字典,所以我们假设以下代码:

my_dict_1 = {}
my_dict_1['foo'] = 1
my_dict_2 = {}
my_dict_2['foo'] = 2

这两个字典是否会使用不同的哈希函数(注意键是相同的),因此它们可以被认为是两个不同的哈希表(我的意思是它们实际上会以不同的方式存储数据) ?


编辑:

是的,字典当然是两个不同的对象,但问题在于它们将用于存储数据的技术!

【问题讨论】:

  • 它们显然不是同一个哈希表。
  • @JohnColeman 感谢您的支持。你能指出一些这样说的文件吗?我是python 的新手,对我来说还不是很清楚。 :/ 你的意思是每个字典都有自己的哈希函数,对吧?我想知道它们是否也独立,但这是为了以后.. :)
  • “不同的哈希函数”是什么意思?哈希函数是一段代码(它是实现定义的)。不过,它们绝对是不同的字典(哈希表)(因为它们是通过构造两个不同的对象)。顺便说一句,它与字典没有任何关系。
  • 我的意思是每个字典使用的哈希函数都不同。如果使用字典作为哈希表,然后使用另一个,我想知道它们会以不同的方式存储数据,因为不同的静默函数。希望现在更清楚@importthis。
  • 我真的很好奇你为什么要问这个问题——为什么哈希函数会不同,又会有什么不同?散列的目的是快速测试两个键是否相同,为每个字典设置不同的散列有什么好处?

标签: c++ python dictionary hash hashtable hash-function


【解决方案1】:

一个简单的 Python shell 实验,显示不同的字典可以使用相同的键:

>>> my_dict_1 = {'foo':1}
>>> my_dict_2 = {'foo':2}
>>> my_dict_1,my_dict_2
({'foo': 1}, {'foo': 2})

This 很好地讨论了它是如何实现的。关键是每个字典都分配了自己的内存部分(当然可以根据需要增长)。 完全相同的哈希函数用于两个字典,但用于探测内存中的不同区域。

【讨论】:

  • 完全相同的哈希函数?该死,这意味着如果我们为两个字典提供完全相同的数据,它们将以完全相同的方式存储它们(在不同的内存位置,但我不在乎),谢谢约翰!
  • @gsamaras:我刚刚浏览了源代码,而且看起来哈希肯定是只通过 key 计算的,而不是例如用 dict 名称加盐或类似的东西。此外,“整数的哈希值与整数相同 (hash(100) == 100),但这是一个实现细节,可能会在没有警告的情况下更改。” (mail.python.org/pipermail/tutor/2003-August/024555.html)
【解决方案2】:

id(...)

id(object) -> 整数

返回对象的标识。这保证在同时存在的对象中是唯一的。 (提示:这是对象的内存地址。

上面是id doc字符串,它表示对象的标识是对象的内存地址,所以我们可以使用id函数查看变量的内存地址:

在你的程序中,我可以看到这样的地址:

def main():
    my_dict_1 = {}
    my_dict_1['foo'] = 1
    my_dict_2 = {}
    my_dict_2['foo'] = 2
    print(hex(id(my_dict_1['foo'])))
    print(hex(id(my_dict_2['foo'])))

if __name__ == '__main__':
    main()

这个程序输出这个:

0x9a33e0
0x9a3400

我们可以看到my_dict_1['foo']my_dict_2['foo']有不同的内存地址。

所以我认为两个dict应该使用相同的哈希函数,但是变量的内存地址应该是哈希值和一个基值的总和。这样,这两个变量就会被存储在不同的内存区域中。

【讨论】:

  • 有一个答案提到了几乎相同的事情。它现在被删除了,所以你看不到它。不过,谢谢,+1 的分析答案,但我认为我的编辑非常清楚。
  • 这些只是整数12的地址,与它们是否被一个或多个dicts引用无关。 (试试看:把print(hex(id(1)))放到同一个程序中。)
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2016-03-14
  • 2019-11-26
  • 1970-01-01
  • 2013-01-08
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多