14、Ruby 中的哈希表、单例方法与类方法

Ruby 中的哈希表、单例方法与类方法

1. 哈希表的哈希部分原理

在哈希表中,“哪个桶”的问题正是哈希部分发挥作用的地方。具体思路如下:
- 为所有对象定义一个返回哈希值的方法。哈希值是根据对象的值以某种方式生成的一个或多或少随机的数字。
- 当需要在哈希表中存储键值对时,从键中提取哈希值。通常使用取模运算符(hash_code % number_of_buckets)来选择一个桶,并将键值对存储在该桶中。
- 之后,当要检索与某个键关联的值时,再次获取该键的哈希码,并使用它来选择正确的桶进行搜索。

哈希码需要具备以下特性才能使整个过程正常工作:
- 稳定性 :如果一个键现在生成一个哈希码,而之后生成另一个不同的哈希码,那么我们最终必然会在错误的桶中查找。
- 一致性 :如果两个键相等(即它们应该从哈希表中返回相同的值),那么当被询问时,它们必须返回相同的哈希码。

2. 构建表现良好的哈希键

在 Ruby 中,Hash 类会调用名为 hash 的方法(这是从 Object 类继承的方法之一)来从其键中获取哈希码。Hash 类使用 eql? 方法来判断两个键是否实际上是同一个键。Object 类中 hash 和 eql? 的默认实现,与 == 和 === 的默认实现一样,是基于对象标识的。默认的 eql? 方法只有在另一个对象与当前对象完全相同时才返回 true,默认的 hash 方法返回对象的 object_id,该值保证是唯一的。

不过,我们可以根据需要重写这些方法,只要遵循哈希基本规则:如果 a.eql?(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值