Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将Base64编码字符串转换为UUID格式_Ruby_Hex_Base64_Uuid - Fatal编程技术网

Ruby 如何将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

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

例如,如果我有

'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”)。连接(“-”)#=>正确