如何将Base64编码的字符串转换为UUID格式

时间:2015-08-05 23:13:40

标签: ruby hex base64 uuid

如何将Base64编码的字符串转换为带有破折号的十六进制编码字符串(基本上是uuid格式)?

例如,如果我有

'FWLalpF2T5mmyxS03Q+hNQ0K' 

然后如何将其转换为:

1562da96-9176-4f99-a6cb-14b4dd0fa135

2 个答案:

答案 0 :(得分:8)

我熟悉unpack,但这促使我学习了cremno指出的指令。

最简单的形式:

b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')

#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"

b64.unpack("m0") 

告诉我们:

#=> ["\x15b\xDA\x96\x91vO\x99\xA6\xCB\x14\xB4\xDD\x0F\xA15\r\n"]

这是一个数组,因此我们使用.first来获取字符串并使用该指令再次解压缩以8-4-4-4-12格式对其进行格式化:

b64.unpack("m0").first.unpack("H8H4H4H4H12")

给我们:

#=> ["1562da96", "9176", "4f99", "a6cb", "14b4dd0fa135"]

一个字符串数组,现在我们只需将它与-

连接起来
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')

#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"

答案 1 :(得分:2)

<强> OOPS

接受的答案有一个缺陷:

b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"

更改b64字符串中的最后一个字符会产生相同的UUID:

b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"

为了防止这种情况,您可能希望将输入(base64或其他任何内容)哈希到正确的长度,例如与MD5:

require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
Digest::MD5.hexdigest(b64).unpack("a8a4a4a4a12").join('-')
# => "df71c785-6552-a977-e0ac-8edb8fd63f6f"

现在完整输入是相关的,将最后一个char结果改为另一个UUID:

require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
Digest::MD5.hexdigest(s).unpack("a8a4a4a4a12").join('-')
# => "2625f170-d05a-f65d-38ff-5d9a7a972382"