루비 정수를 음수가 아닌 최소 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"
나는 이러한 문자열의 사전 식 순서가 올바른지 확인해야하지만, 지금까지 좋아 보인다.
당신은 어떤베이스로 변환하여 문자를 선택하기 위해 그 출력을 사용할 수 있도록하려면
대단히 감사합니다. 위의 편집을 참조하십시오. 나는 이것이 잘 될 것이라고 생각한다. Redis 어휘 순서가 int 순서와 일치하는지 더 많은 테스트가 필요합니다. Redis는 UTF-8에 대해 알지 못하지만 저장하는 옥텟의 렉시 (lex) 순서는 선하여야한다. – Gene
위에서 언급했듯이 UTF-8의 기능 중 하나는 바이트 단위의 정렬은 코드 포인트에 대한 올바른 순서를 제공한다는 것입니다. UTF-8에 대해 "알아야"하는 유일한 것은 인코딩과 디코딩을하는 것입니다. 벙어리 바이트 기반 분류기는 올바른 순서를 부여합니다. –
오른쪽. 감사.그러나 필자는 Redis가 bytewise 정렬이 Ruby의 바이트 변환으로 상식적인 작업을하고 있는지 확인해야했습니다. 정확성은 법적 책임을 포함합니다. 확신 했어야했다. – Gene