Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby整数到字符串键_Ruby_String_Key - Fatal编程技术网

Ruby整数到字符串键

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 但它似乎是垃圾密集型和丑陋型的。我

我正在构建的系统需要将非负Ruby整数转换为尽可能短的UTF-8字符串(应该是八位字符串;请参见下面的编辑)。对字符串的唯一要求是它们的字典顺序与整数的自然顺序相同

Ruby最好的方法是什么

我们可以假设整数是32位,符号位是0。这是成功的:

(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的字节转换一样符合常识。正确性涉及法律责任。必须确定。