私が構築しているシステムは、負でないRuby整数を可能な限り最短のUTF-8文字列(オクテット文字列である必要があります。以下の編集を参照)の値に変換する必要があります。文字列の唯一の要件は、辞書式順序が整数の自然な順序と同じであることです。
これを行うための最良のRubyの方法は何ですか?
整数は32ビットで、符号ビットは0であると想定できます。これは成功です。
(i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr
しかし、それは1)ゴミが多く、2)醜いようです。解決策も検討しましたpack
が、バイトオーダーのために移植性がないようです。
FWIW、アプリケーションはRedisハッシュフィールド名です。キーの作成はパフォーマンスのボトルネックになる可能性がありますが、おそらくそうではありません。この質問は主に「ルビーの方法」についてです。
編集
Abpve UFT-8ではなく「可能な限り短いオクテットの文字列」と言うべきでした。これは、Redisが実際にフィールドキー用に保存するものだからです。真のUTF-8パッキングssemを機能させるための@MarkReedの優れた提案。私が使用しているredis
gemは、拡張コードをRedisのオクテットシーケンスに適切に変換しているようです。たとえば、
REDIS.hset('hash', [0x12345678].pack('U'), 'foo')
正常に動作します。しかしその後
REDIS.hkeys('hash')
戻り値
"\xFC\x92\x8D\x85\x99\xB8"
これらの文字列の辞書式順序が正しいことを確認する必要がありますが、これまでのところ問題はないようです。
編集を終了