Vee*_*rac 97 python hash cpython set python-internals
鉴于比雷埃夫斯对另一个问题的回答,我们有这个
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Run Code Online (Sandbox Code Playgroud)
True在启用哈希随机化的情况下打印大约85%的时间.为什么85%?
Vee*_*rac 128
我将假设这个问题的任何读者都读过这两个:
首先要注意的是,哈希随机化取决于解释器启动.
对于两个集合,每个字母的散列都是相同的,因此唯一重要的是如果存在冲突(订单将受到影响).
通过扣除第二个链接,我们知道这些集合的后备数组从8开始:
_ _ _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我们插入1:
_ 1 _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)
然后插入其余部分:
? 1 ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
然后重新调整为32:
1 can't collide with ? as ? is an even hash
? so 1 is inserted at slot 1 first
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,我们插入其余的:
? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
然后尝试插入1:
Try to insert 1 here, but will
? be rehashed if ? exists
? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
然后它将重新开始:
Try to insert 1 here, but will
be rehashed if ? exists and has
? not rehashed somewhere else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
因此,迭代次序是否不同仅取决于β是否存在.
β的几率是5个字母中的任何一个将散列为1个模8 并散列到1个模32的机会.
因为任何哈希到1模32的哈希值也都是1模8,我们希望找到32个槽的机会,其中五个槽位于槽1中:
5 (number of letters) / 32 (number of slots)
Run Code Online (Sandbox Code Playgroud)
5/32是0.15625,因此两组结构中订单的概率为15.625%.
根本不奇怪,这正是比雷埃夫斯所测量的.
¹技术上即使这并不明显.由于线性探测,我们可以假装5个哈希中的每一个,但由于线性探测,它实际上更有可能发生"聚束"结构......但是因为我们只关注单个槽是否被占用,这不是实际上对我们有影响.
| 归档时间: |
|
| 查看次数: |
9521 次 |
| 最近记录: |