用另一个整数散列一个整数

Hash an integer by another integer

我想要一种使用另一个整数对一个整数进行哈希处理的方法。它应该产生一个新的散列整数。它应该接受一个整数输入和一个键,然后输入被键散列并生成一个整数。该方法看起来像 hash_method(input, key)。碰撞在这里无关紧要,我不是为了安全或比较而使用它们。我很确定这是可能的,看看一些使用挑战的安全算法如何做类似的事情。我将如何在 ruby 中解决这个问题?

哈希例程多种多样,通常选择匹配预期输入分布的详细信息、哈希值的用途以及生成它们的速度。

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

在您的情况下,加密哈希还有一个优势,即它们可以生成高质量的伪随机函数 - 如果两个输入仅相差一位,则结果将不相关。

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

对于大多数标准散列函数使用整数输入没有什么没有什么特别之处,它总体上只是忽略数据类型而忽略字节。鉴于您似乎并不关心哈希输出的特定值,您可以简单地将数字转换为 String 值并将它们输入标准哈希函数。这完全没问题,没有理由不这样做,除非您需要使用 same 哈希函数来区分 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

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

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