Ruby 如何将Base64编码字符串转换为UUID格式
如何将Base64编码字符串转换为带破折号的十六进制编码字符串(基本上转换为uuid格式) 例如,如果我有Ruby 如何将Base64编码字符串转换为UUID格式,ruby,hex,base64,uuid,Ruby,Hex,Base64,Uuid,如何将Base64编码字符串转换为带破折号的十六进制编码字符串(基本上转换为uuid格式) 例如,如果我有 'FWLalpF2T5mmyxS03Q+hNQ0K' 那么如何将其转换为: 1562da96-9176-4f99-a6cb-14b4dd0fa135 我熟悉unpack,但这促使我学习cremno指出的指令 最简单的形式: b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K' b64.unpack("m0").first.unpack("H8H4H4H4H12").joi
'FWLalpF2T5mmyxS03Q+hNQ0K'
那么如何将其转换为:
1562da96-9176-4f99-a6cb-14b4dd0fa135
我熟悉
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"]
这是一个数组,因此我们使用。首先
获取字符串,然后使用指令将其重新解压缩为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"
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"
可以使用(
m
表示Base64,而H
表示十六进制字符串)+添加-
。但是如何按照uuid模式拆分字符串?每个指令后面都可以跟一个数字,指示使用此指令重复的次数。
例如将Base64解码字符串解包到[“1562da96”,“9167”]
。如果IMO不应该为不同的字符串生成相同的UUID,那么将(base64)字符串转换为UUID,这个解决方案会。让我们将字符串中的最后一个字符从K改为L:“fWLPF2T5MMYXS03Q+hNQ0K”。解包(“H8H4H4H12”)。连接(“-”=“fWLPF2T5MMYXS03Q+hNQ0L”。解包(“H8H4H4H12”)。连接(“-”)#=>正确