【问题标题】:What's the best way to hash a url in ruby?在红宝石中散列网址的最佳方法是什么?
【发布时间】:2010-09-09 05:37:27
【问题描述】:

我正在编写一个指向外部链接的网络应用程序。我希望为我可以在 URL 中使用的每个文档创建一个非顺序的、不可猜测的 id。我做了一件显而易见的事情:将 url 视为字符串并在其上使用 str#crypt,但这似乎会阻塞任何非字母数字字符,例如斜线、点和下划线。

对解决这个问题的最佳方法有什么建议吗?

谢谢!

【问题讨论】:

    标签: ruby


    【解决方案1】:

    我还建议查看摘要命名空间中的不同算法。为了更难猜测,而不是(或除此之外)使用秘密密码进行加盐,您还可以使用精确的时间转储:

    require 'digest/md5'
    def hash_url(url)
      Digest::MD5.hexdigest("#{Time.now.to_f}--#{url}")
    end
    

    由于任何散列算法的结果都不能保证是唯一的,因此在假设您的散列可用之前,请不要忘记根据先前生成的散列检查结果的唯一性。 Time.now 的使用使得重试实现起来很简单,因为您只需要调用直到生成唯一的哈希。

    【讨论】:

      【解决方案2】:

      根据您希望字符串的长度,您可以使用几种替代方法:

      require 'digest'
      Digest.hexencode('http://foo-bar.com/yay/?foo=bar&a=22')
      # "687474703a2f2f666f6f2d6261722e636f6d2f7961792f3f666f6f3d62617226613d3232"
      
      require 'digest/md5'
      Digest::MD5.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
      # "43facc5eb5ce09fd41a6b55dba3fe2fe"
      
      require 'digest/sha1'
      Digest::SHA1.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
      # "2aba83b05dc9c2d9db7e5d34e69787d0a5e28fc5"
      
      require 'digest/sha2'
      Digest::SHA2.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
      # "e78f3d17c1c0f8d8c4f6bd91f175287516ecf78a4027d627ebcacfca822574b2"
      

      请注意,这不会是不可猜测的,您可能必须将其与其他一些(秘密但静态的)数据结合起来以对字符串进行加盐:

      salt = 'foobar'
      Digest::SHA1.hexdigest(salt + 'http://foo-bar.com/yay/?foo=bar&a=22')
      # "dbf43aff5e808ae471aa1893c6ec992088219bbb"
      

      现在,为不知道原始内容且无法访问您的源的人生成此哈希变得更加困难。

      【讨论】:

        【解决方案3】:

        使用 Ruby 标准库中的 Digest::MD5

        Digest::MD5.hexdigest(my_url)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 2013-10-17
          • 2019-06-22
          • 2012-07-07
          • 1970-01-01
          相关资源
          最近更新 更多