0

我正在为我的应用程序中的 ID 做一个简单的混淆/缩短。为此,我想将整数映射到字符串,反之亦然。

我可以像这样轻松地to_i交换to_s

>> 635.to_s(36)
# => "hn"
>> "hn".to_i(36)
# => 635

这考虑了 0-9 和 az,但我也想考虑 AZ(大写),它在功能上等同于to_s(62).

在 Ruby 和/或 Rails 中是否有一种简单的方法可以做到这一点?

编辑

如果可能的话,我想用 0-9、az 和 AZ 来做这件事。字符串需要对 url 友好,并且我正在使用其他字符,例如-在 url 中分隔值,因此最好避免使用这些字符。

4

2 回答 2

2

你可以使用基数 58。有一个宝石:http ://rubygems.org/gems/base58

require 'base58'

Base58.encode(12345) # => 4ER
Base58.decode('4ER') # => 12345

正如评论中所指出的,这将遗漏潜在的矛盾字符,例如I,和.l0O

于 2013-10-16T05:34:47.773 回答
1

原来有一个名为 base62 的 gem 完全符合我的描述:

https://github.com/jtzemp/base62

require 'base62'

>> 635.base62_encode
=> "AF"
>> "AF".base62_decode
=> 635

我还使用一个模块使其特定于 rails,该模块可以混合到任何需要混淆/缩短的模型中:

module AdditionalMethods

  module Shortener
    def short_id
      self.id.base62_encode
    end
    def self.included(base)
      base.extend(ClassMethods)
    end
    module ClassMethods
      def original_id(string)
        string.base62_decode
      end
      def find_by_short_id(string)
        self.find_by_id(self.original_id(string))
      end
    end
  end

end

Post.rb

class Post < ActiveRecord::Base
  include AdditionalMethods::Shortener
  ...
end

然后

>> @post.id
=> 52
>> @post.short_id
=> "q"
>> Post.original_id("q")
=> 52
>> Post.find_by_short_id("q")
=> #<Post id: 52 ... >
于 2013-10-16T06:19:22.187 回答