当前位置: 首页 > 面试题库 >

Python的哈希函数顺序背后的逻辑是什么?

申高卓
2023-03-14
问题内容

众所周知,某些Python的数据结构使用 哈希表
存储诸如set或的项目dictionary。因此,这些对象没有顺序。但似乎,对于某些数字序列,这是不正确的。

例如,请考虑以下示例:

>>> set([7,2,5,3,6])
set([2, 3, 5, 6, 7])

>>> set([4,5,3,0,1,2])
set([0, 1, 2, 3, 4, 5])

但是,如果我们进行一些小的更改,则无法排序:

>>> set([8,2,5,3,6])
set([8, 2, 3, 5, 6])

所以问题是:Python的哈希函数如何在整数序列上工作?


问题答案:

尽管SO的问题hash及其顺序有很多问题,但没有人解释哈希函数的算法。

因此,这里您所需要的就是知道python如何计算哈希表中的索引。

如果您浏览hashtable.cCPython源代码中的文件,则会在_Py_hashtable_set函数中看到以下几行内容,这些内容显示了python计算哈希表键索引的方式:

key_hash = ht->hash_func(key);
index = key_hash & (ht->num_buckets - 1);

因此,由于整数的哈希值是整数本身*(-1除外),因此索引基于数字和数据结构的长度(ht->num_buckets - 1),并且使用位与-
和之间(ht->num_buckets - 1)以及该数字进行计算。

现在考虑以下set使用hash-table的示例:

>>> set([0,1919,2000,3,45,33,333,5])
set([0, 33, 3, 5, 45, 333, 2000, 1919])

对于数量,33我们有:

33 & (ht->num_buckets - 1) = 1

实际上是:

'0b100001' & '0b111'= '0b1' # 1 the index of 33

注意 在这种情况下(ht->num_buckets - 1)8-1=70b111

对于1919

'0b11101111111' & '0b111' = '0b111' # 7 the index of 1919

对于333

'0b101001101' & '0b111' = '0b101' # 5 the index of 333

以及上述示例:

>>> set([8,2,5,3,6])
set([8, 2, 3, 5, 6])

'0b1000' & '0b100'='0b0' # for 8
'0b110' & '0b100'='0b100' # for 8

*类的哈希函数int

class int:
    def __hash__(self):
        value = self
        if value == -1:
            value = -2
        return value


 类似资料:
  • 我正试图从现实中解决一个问题 “偶数总和” 但是我不能这样做。下面是问题。 即使是总和也是两个玩家的游戏。玩家将获得N个正整数序列并轮流进行。在每个回合中,玩家选择一个非空切片(连续元素的子序列),使得该切片中的值之和是偶数,然后删除切片并连接序列的其余部分。第一个无法做出合法举动的玩家将输掉比赛。 如果你和你的对手玩这场游戏,你想知道你是否能赢,假设你和对手都玩得很好。你先走。 写一个函数:

  • 2(名)-约翰 3(型号)-客车 4(attr_hash)-由java哈希代码计算

  • 问题内容: 我碰到了Java行,并对它的输出感到困惑。您能否解释一下此代码背后的逻辑 输出: 问题答案: 好吧,它等效于: 真正地将原始内容显式转换为只是使其调用而不是。 我相信to 转换 实际上首先 要进行隐式加宽转换-就像这样: 这些帮助有用?

  • 我正在我想要存储字符串的哈希程序中使用DJB2哈希函数。但是这个哈希函数返回一个非常大的无符号int值作为返回值(哈希表索引)。如果我的表大小很小(比如说13),有没有办法把这个大值转换成更小的。我只想尽可能避免碰撞。 DJB2哈希函数代码如下:

  • C++中的“using”关键字背后的逻辑是什么? 它在不同的情况下使用,我试图找到是否所有这些都有共同点,有一个原因为什么“using”关键字被这样使用。

  • 问题内容: 我无法理解和与axis参数一起使用时的输出。例如: 如您所见,最大值是点(1,1),最小值是点(0,0)。因此,按照我的逻辑,当我运行时: 我期望 我期望 我期望 我期望 我对事物的理解有什么问题? 问题答案: 通过添加参数,NumPy分别查看行和列。如果未指定,则将数组展平为单个一维数组。 表示该操作依次在2D数组的列中 向下 执行。 例如,返回四列中每一列的最小值的索引。每列中的最