用另一个整数散列整数

时间:2015-01-29 05:00:17

标签: ruby hash hashcode

我想要一种使用另一个整数散列整数的方法。它应该产生一个新的散列整数。它应该接受一个整数输入和一个键,输入然后由键进行散列并产生一个整数。该方法看起来像hash_method(input, key)。碰撞在这里无关紧要,我不会将它们用于安全或比较。我很确定可以看到一些使用挑战的安全算法如何做类似的事情。我将如何在红宝石中解决这个问题?

1 个答案:

答案 0 :(得分:0)

哈希例程有很多种,并且通常被选中以匹配预期输入分布的详细信息,哈希值的目的以及生成它们的速度。

但是,您可以在Ruby的标准库中使用现有的哈希例程。大多数加密散列函数的输出是一串字节,可以很容易地解释为整数。为了您的目的,您只需要通过限制长度来确定合适的最大值。

密码哈希在你的情况下也具有优势,它们可以产生高质量的伪随机函数 - 假设两个输入仅相差一个位,结果就不会相关。

HMAC构造将散列函数与两个输入相结合 - 消息和秘密。使用输入编号作为消息,使用密钥作为密钥,可以按原样使用该功能。

对于大多数标准散列函数使用整数输入有 nothing 特别之处,它总体上只是忽略数据类型。鉴于您似乎并不关心哈希输出的特定值,您只需将数字转换为String值并将其提供给标准哈希函数即可。这是完全正常的,没有理由不这样做,除非您需要使用相同的散列函数来区分1"1"

像这样:

require 'openssl'
input = 25
key = 106

full_hash = OpenSSL::HMAC.hexdigest( 
  OpenSSL::Digest.new('sha1'), key.to_s, input.to_s )

# This is an unsigned 32-bit integer
result = full_hash[0..7].to_i(16)

#  => 2746028024

此结果适用于校验和或需要伪随机重新分配值的算法。它有一个缺陷,因为在需要生成许多值的情况下速度不会很高。

如果您对较低质量的随机性感到满意,可以使这更简单 - 例如,您可以使用线性同余生成器。这可能比上面的更快,但可能会在输出中显示出不需要的模式。