![]() |
1
4
这个
在[so]上有几十个“这种方法从何而来”的问题,答案总是一样的:知道方法从何而来的最好方法,就是简单地问它:
所以,
不幸的是,由于我不明白的原因,
the documentation for
所以,正如你所看到的,在
所以,我们知道这个方法叫做
它到底是做什么的?好吧,我们都知道散列函数是什么:它是一个函数,将一个更大的,潜在的无限大的输入空间映射到一个更小的,有限的,输出空间。特别是,在本例中,输入空间是所有Ruby对象的空间,输出空间是“快速整数”(也就是那些过去被称为
我们知道散列表是如何工作的:如果我想找到一个值,我只需要根据键的散列值将值放入bucket中,然后我只需要计算键的散列值(这很快),并知道我在哪个bucket中(在恒定时间内)找到值,而不是一个键值对数组,在那里我需要将键与每个键进行比较在数组(线性搜索)中查找值。 但是,存在一个问题:由于散列的输出空间小于输入空间,因此有不同的对象具有相同的散列值,因此最终位于同一个bucket中。因此,当两个对象具有不同的散列值时,我知道它们是不同的,但如果它们具有相同的散列值,那么它们仍然可能是不同的,我需要对它们进行比较以确保相等,这就是散列和相等之间的关系的来源。还要注意的是,当多个键在同一个bucket中向上时,我将再次将搜索键与bucket中的每个键进行比较(线性搜索)以找到值。
由此我们可以得出
|
![]() |
2
3
这个
Ruby散列是散列映射数据结构的实现,它们使用
假设这两个方法协同工作以提供散列的相等信息,如果
如果不覆盖它,则会发生以下情况:
如果
现在hash知道这些对象是相等的,因此只存储一个键值对 |
![]() |
cluster1 · 采取独立的新行动的好处是什么? 5 月前 |
![]() |
Robert · 使用JSON或哈希时,将NULL替换为NIL 5 月前 |
![]() |
lucycoco · 如何解决pod安装问题并成功运行pod安装? 9 月前 |
![]() |
Vessel · Ruby-包含任意数量元素的所有排列 9 月前 |