Ruby整数到字符串键
我正在构建的系统需要将非负Ruby整数转换为尽可能短的UTF-8字符串(应该是八位字符串;请参见下面的编辑)。对字符串的唯一要求是它们的字典顺序与整数的自然顺序相同 Ruby最好的方法是什么 我们可以假设整数是32位,符号位是0。这是成功的:Ruby整数到字符串键,ruby,string,key,Ruby,String,Key,我正在构建的系统需要将非负Ruby整数转换为尽可能短的UTF-8字符串(应该是八位字符串;请参见下面的编辑)。对字符串的唯一要求是它们的字典顺序与整数的自然顺序相同 Ruby最好的方法是什么 我们可以假设整数是32位,符号位是0。这是成功的: (i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr 但它似乎是垃圾密集型和丑陋型的。我
(i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr
但它似乎是垃圾密集型和丑陋型的。我还研究了pack
解决方案,但由于字节顺序的原因,这些解决方案似乎不可移植
FWIW,应用程序是Redis散列字段名。构建密钥可能是性能瓶颈,但可能不是。这个问题主要是关于“Ruby方式”
编辑
Abpve我应该说“尽可能短的八位字节串”,而不是UFT-8,因为这就是Redis的实际情况
存储字段键@马克·里德关于尝试真正的UTF-8包装SSEM工作的极好建议。我使用的redis
gem似乎可以正确地将扩展代码转换为redis的八位字节序列:例如
REDIS.hset('hash', [0x12345678].pack('U'), 'foo')
很好。但是
REDIS.hkeys('hash')
返回
"\xFC\x92\x8D\x85\x99\xB8"
我需要验证这些字符串的字典顺序是否正确,但到目前为止看起来还不错
结束编辑您希望能够转换为任何基,并使用该输出选择您的字符。查看此答案如果必须是有效的UTF-8,则仅将代码点编码为UTF-8字符不会有太大的改进;UTF-8的一个特点是编码字符按正确的数字顺序排序,并且它只使用格式规则所需的最小字节数
[i].pack('U')
请注意,UTF-8是面向字节的,因此不存在端点问题
如果您实际上不是指UTF-8,请澄清您的意思。非常感谢。请参见上面的编辑。我认为这会很好。需要更多测试以确保Redis词法顺序与int顺序匹配。Redis不知道UTF-8,但它存储的八位字节的lex顺序应该是好的。正如我前面提到的,UTF-8的一个特性是,按字节排序也可以为代码点提供正确的顺序。唯一需要“了解”UTF-8的是编码和解码的内容;基于哑字节的分类器将给出正确的排序。谢谢但我需要看看Redis,以验证它的字节排序是否与Ruby的字节转换一样符合常识。正确性涉及法律责任。必须确定。