2013-10-16 49 views
0

我正在爲我的應用程序中的ID做一個簡單的混淆/縮短器。爲此,我想將整數映射到字符串,反之亦然。對於0-9,a-z,A-Z區分大小寫to_s和to_i方法?

我可以to_ito_s輕鬆交換像這樣:

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

這是考慮到0-9和AZ,但我也想考慮AZ(大寫),這將是功能相當於to_s(62)

有沒有一種簡單的方法在Ruby和/或Rails中做到這一點?

編輯

我想和0-9做到這一點,A-Z和A-Z如果可能的話。這些字符串需要具有網址友好性,並且我使用其他字符(如-)來分隔網址中的值,因此最好避免使用這些值。

+0

這可能是東西,不這樣做「在」 Ruby on Rails的儘可能多的東西,你只會用Ruby本身做的。根本就沒有關於這個問題的web框架。 – vgoff

+0

我認爲base 64更受歡迎,因爲它在編程的上下文中是一個統一的數字(2^6),並且有[內置庫](http://ruby-doc.org/stdlib-2.0)。 0/libdoc/base64/rdoc/Base64.html)。 – sawa

回答

1

原來有一個寶石稱爲base62這不正是我所描述:

https://github.com/jtzemp/base62

require 'base62' 

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

我也使導軌專用與可混入任何車型所需要的模塊混淆/縮短:

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 ... > 
2

你可以使用底座58有一個寶石爲:http://rubygems.org/gems/base58

require 'base58' 

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

正如在評論中指出,這將省去潛在矛盾的字符,如Il0O

+0

這考慮到大多數字體有0和O看起來相同以及'l'和1和'I'看起來一樣。所以它可能適用於OP,但不確定它是否完全匹配。然而,提供寶石位置的好處是他可以輕鬆修改它以適應缺少的字符。 +1。 – vgoff

+0

錯過了'0','l','I','O'。該OP意味着基地62,而不是基地58. – sawa

+1

是的,什麼@sawa說。 :) – vgoff

相關問題