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

4

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

例如,如果我有一个以Base64编码的字符串:

'FWLalpF2T5mmyxS03Q+hNQ0K' 

那我该如何将它转换为:

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

1
可以使用 String#unpackm 表示 Base64,H 表示十六进制串)+ Array#join 来添加 - - cremno
但是我该如何按照uuid模式拆分字符串? - user3075906
每个指令后面都可以跟着一个数字,表示使用该指令重复的次数。例如:"H8H4" 可以将base64解码后的字符串解压为 ["1562da96", "9167"]。 - cremno
2个回答

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
将(base64)字符串转换为UUID时,我认为不应该为不同的字符串生成相同的UUID,但是这个解决方案确实会产生相同的UUID。让我们改变字符串中的最后一个字符从K到L:`'FWLalpF2T5mmyxS03Q+hNQ0K'.unpack("H8H4H4H4H12").join('-') == 'FWLalpF2T5mmyxS03Q+hNQ0L'.unpack("H8H4H4H4H12").join('-')

=> true`

- svoop

3

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"

现在完整的输入都是相关的,改变最后一个字符会导致不同的UUID:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接