我正在构建的系统需要将非负Ruby整数转换为最短的UTF-8字符串(应该是八位字符串;请参阅下面的编辑)值。对字符串的唯一要求是它们的字典顺序与整数上的自然顺序相同。
最好的Ruby方法是什么?
我们可以假设整数是32位,符号位是0.这是成功的:
(i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr
但它似乎是1)垃圾密集和丑陋。我还查看了pack
解决方案,但由于字节顺序,这些解决方案似乎不可移植。
FWIW,应用程序是Redis哈希字段名称。构建密钥可能是性能瓶颈,但可能不是。这个问题主要是关于“Ruby方式”。
修改
Abpve我应该说“尽可能短的八位字符串”而不是UFT-8,因为这就是Redis实际上
现场钥匙的商店。 @Mark Reed的优秀建议是尝试真正的UTF-8包装系统。我正在使用的redis
gem似乎正确地将扩展代码转换为Redis的八位字节序列:例如,
REDIS.hset('hash', [0x12345678].pack('U'), 'foo')
工作正常。但是接下来
REDIS.hkeys('hash')
返回
"\xFC\x92\x8D\x85\x99\xB8"
我需要验证这些字符串的字典顺序是否正确,但到目前为止看起来还不错。
结束修改
答案 0 :(得分:2)
如果它必须是有效的UTF-8,那么将代码点编码为UTF-8字符不会有太大的改进; UTF-8的一个特性是编码字符按正确的数字顺序排序,它只使用格式规则所需的最小字节数。
[i].pack('U')
请注意,UTF-8是面向字节的,因此没有字节序问题。
如果你实际上并不是指UTF-8,那么请澄清你的意思。
答案 1 :(得分:0)
您希望能够转换为任何基础,并使用该输出来选择您的角色。请参阅此回答https://stackoverflow.com/a/2895806/131227