将UUID转换为字节

时间:2014-01-28 15:09:40

标签: ruby

我正在尝试使用uuid并将其转换回生成的字节。

我一直在研究SecureRandom来源,看看我是否可以将UUID反向工程化为字节,但是我很难用它。

我需要做的基本上与此相反:

def self.uuid
  ary = self.random_bytes(16).unpack("NnnnnN")
  ary[2] = (ary[2] & 0x0fff) | 0x4000
  ary[3] = (ary[3] & 0x3fff) | 0x8000
  "%08x-%04x-%04x-%04x-%04x%08x" % ary
end

所以我有这个uuid:

"4b6d2066-78ac-49db-b8c4-9f58d8e8842f"

最开始是这个字节串:

"Km fx\xAC\xC9\xDB\xF8\xC4\x9FX\xD8\xE8\x84/"

这是解压缩的:

[
    [0] 1265442918,
    [1] 30892,
    [2] 51675,
    [3] 63684,
    [4] 40792,
    [5] 3639116847
]

ary[2]ary[3]之后修改

[
    [0] 1265442918,
    [1] 30892,
    [2] 18907,
    [3] 47300,
    [4] 40792,
    [5] 3639116847
]

所以我把原来的uuid拆分成了未加入的部分:

[
    [0] "4b6d2066",
    [1] "78ac",
    [2] "49db",
    [3] "b8c4",
    [4] "9f58",
    [5] "d8e8842f"
]

我遇到的问题是我不确定这两行的反转是什么:

ary[2] = (ary[2] & 0x0fff) | 0x4000
ary[3] = (ary[3] & 0x3fff) | 0x8000

而且我也不确定如何将剩余的元素恢复为整数值。我确定它是某种形式的packunpack,但我不确定它需要什么。

1 个答案:

答案 0 :(得分:2)

  

我遇到的问题是我不确定这两行的反转是什么:

ary[2] = (ary[2] & 0x0fff) | 0x4000
ary[3] = (ary[3] & 0x3fff) | 0x8000

这两行不可恢复......他们正在做一些算术来设置v4(又名随机)uuid的版本和变体位,以符合RFC 4122。

http://www.ietf.org/rfc/rfc4122.txt

这些数字应符合:

byte & UUID_CLEAR_VER | UUID_VERSION_4 = byte & b'00001111' | b'01000000'
byte & UUID_CLEAR_VAR | UUID_VAR_RFC   = byte & b'00111111' | b'10000000'

正如上面的行和rfc可能暗示的那样,你真正想要的不是uuid的字节,而是它的位,以便对其组件进行反向工程。它实际上是一个128位整数,十六进制表示基本上是通过bin2hex传递整个事物并重新格式化它以便它具有相当的可读性。

以下是PHP中类似代码的变体,供参考:

https://github.com/UnionOfRAD/lithium/blob/master/util/String.php#L55