代码之家  ›  专栏  ›  技术社区  ›  redcodefinal

用另一个整数哈希一个整数[closed]

  •  0
  • redcodefinal  · 技术社区  · 11 年前

    我想用另一个整数来散列一个整数。它应该产生一个新的散列整数。它应该接受一个整数输入和一个键,然后通过该键对输入进行散列并生成一个整数。方法如下所示 hash_method(input, key) 。冲突在这里无关紧要,我不是为了安全或比较而使用它们。我非常确信,这是可能的,因为一些使用挑战的安全算法会做类似的事情。我该怎么用红宝石做这件事?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Neil Slater    11 年前

    哈希例程是多种多样的,通常根据预期输入分布的细节、哈希值的用途和生成它们的速度进行选择。

    然而,您可以使用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
    

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

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