Ruby整数到字符串键

时间:2012-11-26 16:53:19

标签: ruby string key

我正在构建的系统需要将非负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"

我需要验证这些字符串的字典顺序是否正确,但到目前为止看起来还不错。

结束修改

2 个答案:

答案 0 :(得分:2)

如果它必须是有效的UTF-8,那么将代码点编码为UTF-8字符不会有太大的改进; UTF-8的一个特性是编码字符按正确的数字顺序排序,它只使用格式规则所需的最小字节数。

[i].pack('U')

请注意,UTF-8是面向字节的,因此没有字节序问题。

如果你实际上并不是指UTF-8,那么请澄清你的意思。

答案 1 :(得分:0)

您希望能够转换为任何基础,并使用该输出来选择您的角色。请参阅此回答https://stackoverflow.com/a/2895806/131227