将一个整数哈希为另一个整数



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

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

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

加密哈希在您的情况下还具有优势,即它们会产生高质量的伪随机函数 - 给定两个仅相差一位的输入,结果不会相关。

HMAC 构造将哈希函数与两个输入(消息和机密)相结合。使用输入数字作为消息,使用密钥作为密钥,您可以按原样使用该函数。

对于大多数标准哈希函数使用整数输入并没有什么特别之处,总的来说,它只是忽略数据类型的字节。鉴于您似乎并不关心哈希输出的特定值,您可以简单地将数字转换为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

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

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

最新更新