ruby base64以2位字符开头编码128位数,以防止结尾填充

问题描述 投票:2回答:1

这个问题是我上一个问题的后续问题:How can I convert a UUID to a string using a custom character set in Ruby?但我会尝试将其作为一个单独的具体问题来制定。

我有一个Ruby 128位UUID作为十六进制值:

SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"

如果我正确地得到了IFC规范(http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcutilityresource/lexical/ifcgloballyuniqueid.htm),我想对它进行Base64编码,但是我想要输出以2位字符(4个选项)开头,而不是6位(需要64位)选项)。

这样我认为我最终可以得到一个22个字符的字符串(1个2位,6个中的21个,总共128位)。

是否有可能以这种方式调整Ruby base64?

ruby uuid guid ifc
1个回答
2
投票

简答:不。从技术上讲,这不是标准的Base64,因此Ruby的标准库不会处理它。

Ruby的Base64 lib将其输入作为字节,所以你需要让你的输入数据被8整除。但是你想要在你的UUID前面有4个零位,所以4 + 128 = 132所以8的下一个最接近的倍数是136即17个字节。您可以在最后丢弃额外的随机性:

x = SecureRandom.gen_random 17   # get a little extra randomness
x[0] = (x[0].ord & 0x0f).chr     # 0 out the first four bits
Base64.strict_encode64(x)[0...22] # discard extra randomness

这种方法的一个缺点是你的128位UUID在x内奇怪地对齐并且很难自己看到。如果你想得到128位,你可以用一些打包/解包来做到这一点:

[x.unpack("B*")[0][4...132]].pack("B*")
© www.soinside.com 2019 - 2024. All rights reserved.