Сжатие идентификатора объекта MongoDB в Ruby - PullRequest
1 голос
/ 08 февраля 2011

Я ищу способ кодирования идентификатора объекта в строку меньшего размера, а также способ его декодирования снова.

В основном я хочу, например, чтобы идентификатор "47cc67093475061e3d95369d" превратился во что-то вроде "adff232"… a'la bit.ly и т. Д.

Есть ли драгоценный камень для этого?

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Использовать кодировку base62. Есть несколько драгоценных камней, но это должно быть так просто, как:

id.to_s.to_i(16).base62_encode

В вашем примере, ваш вывод будет sTIRzdDETzTR6YOh.

0 голосов
/ 08 августа 2011

Если вы не собираетесь отображать сжатую строку, вы можете сжать id наполовину с помощью pack и unpack:

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