【问题标题】:How to convert a Base64 encoded string to UUID format如何将 Base64 编码的字符串转换为 UUID 格式
【发布时间】:2015-08-05 23:13:40
【问题描述】:

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

例如,如果我有

'FWLalpF2T5mmyxS03Q+hNQ0K' 

那我怎么转换成:

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

【问题讨论】:

  • 可以使用String#unpackm 用于 Base64 和 H 用于十六进制字符串)+Array#join 添加-
  • 但是如何按照 uuid 模式拆分字符串?
  • Each directive may be followed by a number, indicating the number of times to repeat with this directive. 例如"H8H4" 将base64 de编码的字符串解包到["1562da96", "9167"]

标签: ruby hex base64 uuid


【解决方案1】:

我熟悉 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"

【讨论】:

  • 如果 IMO 不应该为不同的字符串生成相同的 UUID,则将 (base64) 字符串转换为 UUID,但是,此解决方案可以。让我们将字符串中的最后一个字符从 K 更改为 L:'FWLalpF2T5mmyxS03Q+hNQ0K'.unpack("H8H4H4H4H12").join('-') == 'FWLalpF2T5mmyxS03Q+hNQ0L'.unpack("H8H4H4H4H12").join('-') # => true
【解决方案2】:

哎呀

接受的答案有缺陷:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2019-02-16
    • 1970-01-01
    • 2021-06-06
    • 2020-10-26
    • 2018-08-05
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多