ruby object.hash

ruby object.hash,ruby,Ruby,对象哈希值的含义是什么?在哪种情况下,两个对象具有相同的哈希值??还有人说数组散列不能是散列键,这与对象的散列值有关,为什么?对于要存储在散列映射或散列集中的对象,以下条件必须成立: 如果两个对象被视为相等,则它们的哈希值也必须相等 如果两个对象不相等,则它们的哈希值可能会不同(两个不同对象的哈希值越经常相同,hashmap/集上的操作性能就越差) 因此,如果两个对象具有相同的散列值,则很有可能(但不能保证)它们相等 上面提到的“相等”的确切含义取决于哈希方法的实现者。但是,您应该始终实现eql

对象哈希值的含义是什么?在哪种情况下,两个对象具有相同的哈希值??还有人说数组散列不能是散列键,这与对象的散列值有关,为什么?

对于要存储在散列映射或散列集中的对象,以下条件必须成立:

如果两个对象被视为相等,则它们的哈希值也必须相等

如果两个对象不相等,则它们的哈希值可能会不同(两个不同对象的哈希值越经常相同,hashmap/集上的操作性能就越差)

因此,如果两个对象具有相同的散列值,则很有可能(但不能保证)它们相等

上面提到的“相等”的确切含义取决于哈希方法的实现者。但是,您应该始终实现
eql?
,以使用与哈希相同的相等定义

对于不覆盖散列的类(即使用对象的散列实现的类),散列相等是根据对象标识定义的。即,当且仅当两个对象位于内存中的同一位置时,才认为两个对象相等

在ruby高达1.8.6的版本中,数组和哈希并没有覆盖
Hash
。因此,如果使用数组(或散列)作为散列键,则只能检索键的值,前提是使用与检索键完全相同的数组(而不是具有相同内容的数组)


在ruby 1.8.7中,+
Array#hash
hash#hash
(以及它们的
eql?
方法)被定义为在元素相等时相等。

哈希值没有固有的含义,但它是表示该对象的一种方式,可以将其与相同类型的其他对象区分开来。当您创建一个对象时,它需要实现哈希,这样,如果两个对象具有相同的哈希值,那么它们也将相等。两个物体相等意味着什么取决于物体;例如,如果定义Person对象,您可能希望说Person的两个实例具有相同的名称、id号和生日,则它们是相等的。或者你选择的任何标准


使用数组或散列作为散列键现在可以工作了,因为两者都实现了散列(因此散列值基于它们的内容)。但是,如果有可能修改的话,使用可修改对象(如数组)作为键时可能会遇到问题。例如,如果您有一个Array类型的变量,并且您使用它作为键将某些内容放入哈希,然后您向数组中添加了一些内容,并尝试使用该变量作为键从哈希中获取某些内容,那么它将不起作用(因为数组的哈希值已更改)。此问题的解决方案是在修改数组后对哈希调用Rehash。

您需要的是。
它不仅适用于对象,而且是一个更广泛的概念。

让我们从基础开始:

在理解Object.hash之前,需要考虑三件事

  • 内存地址=RAM中对象的地址
  • 值=对象的值
  • 类型=对象的类型
  • 现在让我们了解不同的对象比较运算符

  • “eql?”检查两个操作数的值是否相等
  • “==”检查两个操作数的值和类型是否相同
  • “相等?”检查这是同一个物体吗
  • 示例1:若两个对象的地址相同,则它们指向相同的内存位置,其值和类型也相同

    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
    
    结论: 若对象的值和类型相同,那个么它将具有相同的散列