我正在尝试使用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
而且我也不确定如何将剩余的元素恢复为整数值。我确定它是某种形式的pack
或unpack
,但我不确定它需要什么。
答案 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