2012-11-26 4 views
1

루비 정수를 음수가 아닌 최소 UTF-8 문자열 (옥텟 문자열이어야 함, 아래의 편집 참조) 값으로 변환해야하는 시스템입니다. 문자열에 대한 유일한 요구 사항은 사전 식 순서가 정수에 대한 자연 순서와 동일해야한다는 것입니다.Ruby의 문자열 키

Ruby에서 가장 좋은 방법은 무엇입니까?

우리는 가정 할 수 정수는 32 비트이며, 부호 비트는이 성공적으로 0입니다 :

(i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr 

그러나 1) 쓰레기 강렬하고 2) 추한 것으로 보인다. 또한 pack 솔루션을 살펴 보았지만 바이트 순서로 인해 이식성이 없어 보입니다.

FWIW, 응용 프로그램은 Redis 해시 필드 이름입니다. 키를 만드는 것은 성능 병목 현상이 될 수 있지만 아마도 그렇지 않을 수 있습니다. 이 질문은 대부분 "Ruby 방식"에 관한 것입니다.

편집

Abpve 내가 말했다해야 아니라 UFT-8보다 "옥텟의 짧은 문자열",이 때문에 어떤 필드 키 레디 스 실제로 저장합니다. @Mark Reed가 제안한 진정한 UTF-8 패킹을 시도해 보자. 예를 들어,

REDIS.hset('hash', [0x12345678].pack('U'), 'foo') 

잘 작동 : 내가 사용 redis 보석은 제대로 레디 스에 대한 옥텟 시퀀스로 확장 된 코드를 변환하는 것 같다. 그러나

REDIS.hkeys('hash') 

반환

"\xFC\x92\x8D\x85\x99\xB8" 

나는 이러한 문자열의 사전 식 순서가 올바른지 확인해야하지만, 지금까지 좋아 보인다.

당신은 어떤베이스로 변환하여 문자를 선택하기 위해 그 출력을 사용할 수 있도록하려면

답변

2

유효한 UTF-8이어야하는 경우 코드 포인트를 UTF-8 문자로 인코딩하는 것 이상의 많은 개선을 얻지는 못할 것입니다. UTF-8의 기능 중 하나는 인코딩 된 문자가 적절한 숫자 순서로 정렬되며 형식의 규칙에 필요한 최소 바이트 수만 사용한다는 것입니다.

[i].pack('U') 

UTF-8은 바이트 지향적이므로 엔디안 문제가 없습니다.

실제로 UTF-8을 의미하지 않았다면, 당신이 의미 한 바를 명확히하십시오.

+0

대단히 감사합니다. 위의 편집을 참조하십시오. 나는 이것이 잘 될 것이라고 생각한다. Redis 어휘 순서가 int 순서와 일치하는지 더 많은 테스트가 필요합니다. Redis는 UTF-8에 대해 알지 못하지만 저장하는 옥텟의 렉시 (lex) 순서는 선하여야한다. – Gene

+0

위에서 언급했듯이 UTF-8의 기능 중 하나는 바이트 단위의 정렬은 코드 포인트에 대한 올바른 순서를 제공한다는 것입니다. UTF-8에 대해 "알아야"하는 유일한 것은 인코딩과 디코딩을하는 것입니다. 벙어리 바이트 기반 분류기는 올바른 순서를 부여합니다. –

+0

오른쪽. 감사.그러나 필자는 Redis가 bytewise 정렬이 Ruby의 바이트 변환으로 상식적인 작업을하고 있는지 확인해야했습니다. 정확성은 법적 책임을 포함합니다. 확신 했어야했다. – Gene