2011-02-08 2 views
1

오브젝트 ID를 더 작은 문자열로 인코딩하고 다시 디코드 할 수있는 방법을 찾고 있습니다.Ruby에서 MongoDB 오브젝트 ID 압축하기

기본적으로 나는이 일을 어떤 보석이 있습니까 인스턴스의 ID "47cc67093475061e3d95369d" "adff232"와 같은 무언가로 설정하는 ... bit.ly 일품 등

줄까?

감사합니다.

답변

1

base62 인코딩을 사용하십시오. 이 몇 가지 보석이 있지만, 그것은뿐만 단순해야한다 :

귀하의 예제의 경우
id.to_s.to_i(16).base62_encode 

, 당신의 출력이 sTIRzdDETzTR6YOh 될 것이다.

+0

감사합니다! 다른 방법은 어떨까요? sTIRzdDETzTR6YOh에서 47cc67093475061e3d95369d로? – Erik

+3

검색 엔진은 대소 문자를 구분하지 않으므로 기본 62를주의해야합니다. – khelll

+0

URL에 사용할 수있는 새로운 고유 필드를 추가하여 다른 방법으로이 문제를 해결했습니다. rand (Time.now.to_i) .to_s (36) – khelll

0

당신이 압축 된 문자열을 표시하지 않으려면, 당신은 packunpack 절반으로 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 
관련 문제