ruby object.hash
对象哈希值的含义是什么?在哪种情况下,两个对象具有相同的哈希值??还有人说数组散列不能是散列键,这与对象的散列值有关,为什么?对于要存储在散列映射或散列集中的对象,以下条件必须成立: 如果两个对象被视为相等,则它们的哈希值也必须相等 如果两个对象不相等,则它们的哈希值可能会不同(两个不同对象的哈希值越经常相同,hashmap/集上的操作性能就越差) 因此,如果两个对象具有相同的散列值,则很有可能(但不能保证)它们相等 上面提到的“相等”的确切含义取决于哈希方法的实现者。但是,您应该始终实现ruby object.hash,ruby,Ruby,对象哈希值的含义是什么?在哪种情况下,两个对象具有相同的哈希值??还有人说数组散列不能是散列键,这与对象的散列值有关,为什么?对于要存储在散列映射或散列集中的对象,以下条件必须成立: 如果两个对象被视为相等,则它们的哈希值也必须相等 如果两个对象不相等,则它们的哈希值可能会不同(两个不同对象的哈希值越经常相同,hashmap/集上的操作性能就越差) 因此,如果两个对象具有相同的散列值,则很有可能(但不能保证)它们相等 上面提到的“相等”的确切含义取决于哈希方法的实现者。但是,您应该始终实现eql
eql?
,以使用与哈希相同的相等定义
对于不覆盖散列的类(即使用对象的散列实现的类),散列相等是根据对象标识定义的。即,当且仅当两个对象位于内存中的同一位置时,才认为两个对象相等
在ruby高达1.8.6的版本中,数组和哈希并没有覆盖Hash
。因此,如果使用数组(或散列)作为散列键,则只能检索键的值,前提是使用与检索键完全相同的数组(而不是具有相同内容的数组)
在ruby 1.8.7中,+
Array#hash
和hash#hash
(以及它们的eql?
方法)被定义为在元素相等时相等。哈希值没有固有的含义,但它是表示该对象的一种方式,可以将其与相同类型的其他对象区分开来。当您创建一个对象时,它需要实现哈希,这样,如果两个对象具有相同的哈希值,那么它们也将相等。两个物体相等意味着什么取决于物体;例如,如果定义Person对象,您可能希望说Person的两个实例具有相同的名称、id号和生日,则它们是相等的。或者你选择的任何标准
使用数组或散列作为散列键现在可以工作了,因为两者都实现了散列(因此散列值基于它们的内容)。但是,如果有可能修改的话,使用可修改对象(如数组)作为键时可能会遇到问题。例如,如果您有一个Array类型的变量,并且您使用它作为键将某些内容放入哈希,然后您向数组中添加了一些内容,并尝试使用该变量作为键从哈希中获取某些内容,那么它将不起作用(因为数组的哈希值已更改)。此问题的解决方案是在修改数组后对哈希调用Rehash。您需要的是。
它不仅适用于对象,而且是一个更广泛的概念。让我们从基础开始: 在理解Object.hash之前,需要考虑三件事
a="5"
b=a
a.object_id => 194639
b.object_id => 194639
a.eql?(b) => true
a==b => true
a.equal?(b) => true
示例2:下面的示例演示了字符串和整数“5”的哈希不同
> "5".eql?(5) => false
> 5.eql?(5) => true
> "5".eql?("5") => true
> 5.hash => -3271834327245180286
> "5".hash => -3126022673147098896
结论:
若对象的值和类型相同,那个么它将具有相同的散列