Ruby on rails 在Ruby中压缩MongoDB对象ID

Ruby on rails 在Ruby中压缩MongoDB对象ID,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我正在寻找一种将对象ID编码为较小字符串的方法,以及再次解码的方法 基本上,我希望例如一个ID“47cc67093475061e3d95369d”变成类似“adff232”…a'la bit.ly,等等 有什么宝石可以做这件事吗 谢谢 使用base62编码。有几种宝石,但应该简单到: id.to_s.to_i(16).base62_encode 在您的示例中,您的输出将是sTIRzdDETzTR6YOh使用base62编码。有几种宝石,但应该简单到: id.to_s.to_i(16).base

我正在寻找一种将对象ID编码为较小字符串的方法,以及再次解码的方法

基本上,我希望例如一个ID“47cc67093475061e3d95369d”变成类似“adff232”…a'la bit.ly,等等

有什么宝石可以做这件事吗


谢谢

使用base62编码。有几种宝石,但应该简单到:

id.to_s.to_i(16).base62_encode

在您的示例中,您的输出将是
sTIRzdDETzTR6YOh

使用base62编码。有几种宝石,但应该简单到:

id.to_s.to_i(16).base62_encode

在您的示例中,您的输出将是
sTIRzdDETzTR6YOh

如果您不想显示压缩的字符串,您可以使用
pack
unpack
id
压缩一半:

id = "47cc67093475061e3d95369d"
puts id.length             #=> 24

compressed_id = id.to_a.pack('H*')
p compressed_id            #=> "G\314g\t4u\006\036=\2256\235"
puts compressed_id.length  #=> 12

uncompressed_id = compressed_id.unpack('H*')[0]
p uncompressed_id          #=> "47cc67093475061e3d95369d"
puts uncompressed_id == id #=> true

如果不想显示压缩的字符串,可以使用
pack
unpack
id
压缩一半:

id = "47cc67093475061e3d95369d"
puts id.length             #=> 24

compressed_id = id.to_a.pack('H*')
p compressed_id            #=> "G\314g\t4u\006\036=\2256\235"
puts compressed_id.length  #=> 12

uncompressed_id = compressed_id.unpack('H*')[0]
p uncompressed_id          #=> "47cc67093475061e3d95369d"
puts uncompressed_id == id #=> true

谢谢反过来呢?从sTIRzdDETzTR6YOh到47cc67093475061e3d95369d?你必须小心base 62,因为搜索引擎不区分大小写。我用另一种方法解决了这个问题,添加了一个新的可用于URL的唯一字段:rand(Time.now.to_I)。to_s(36)@khell这与搜索引擎有什么关系?MongoDB区分大小写。关于兰德的解决方案,要小心。这样可能会导致ID冲突。这是一个猜测,为什么他需要一个简短的ID:)。是的,有了独特的索引,一切都会好起来的。谢谢!反过来呢?从sTIRzdDETzTR6YOh到47cc67093475061e3d95369d?你必须小心base 62,因为搜索引擎不区分大小写。我用另一种方法解决了这个问题,添加了一个新的可用于URL的唯一字段:rand(Time.now.to_I)。to_s(36)@khell这与搜索引擎有什么关系?MongoDB区分大小写。关于兰德的解决方案,要小心。这样可能会导致ID冲突。这是一个猜测,为什么他需要一个简短的ID:)。是的,有了唯一的索引,一切都会好起来的。