首页 > 解决方案 > Ruby 相当于 Python 的 hash() 是什么?

问题描述

假设我有一个Array: ['a', 'b', 'c']。我想记录我以前是否看过一个特定的数组。

我可以将数组放在 a 中Set,但是如果我不需要存储数组的内容,那是很浪费的,只是我以前见过它。

在 Python 中,我可以散列一个元组(即hash(('a', 'b', 'c')))并将结果存储在一个集合中来实现这一点。在 Ruby 中执行此操作的方法是什么?

标签: ruby

解决方案


Ruby#hash在大多数对象上都有,包括 Array,但这些值不是唯一的,最终会发生冲突。

对于任何严肃的用途,我强烈建议使用 SHA2-256 或更强的东西,因为这些是旨在最大限度地减少冲突的加密哈希。

例如:

require 'digest/sha2'

array = %w[ a b c ]

array.hash
# => 3218529217224510043

Digest::SHA2.hexdigest(array.inspect)
# => "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"

该值将相对独特。SHA2-256 冲突非常罕见,因为该散列的绝对大小是 256 位与 64 位#hash值。这不是强 4 倍,而是6.2。考虑到其中有 57 个零,这个数字也可能是“数以万计”。


推荐阅读