从 python 中的 java 代码复制 uuid
Reproduce uuid from java code in python
在 Java 中创建应用程序文件,其中文件名是从使用函数 UUID.nameUUIDFromBytes
创建的蛋白质序列(例如 TTCCPSIVARSNFNVCRLPGTPEAICATYTGCIIIPGATCPGDYAN)生成的 UUID。这导致 UUID c6a0deb5-0c4f-3961-9d19-3f0fde0517c2
.
UUID.namedUUIDFromBytes
不将名称空间作为参数,而在 python uuid.uuid3
中是。根据 What namespace does the JDK use to generate a UUID with nameUUIDFromBytes?,名称空间应该作为名称的一部分传递,但不再可能更改 java 代码。
有没有办法在 python 代码中创建自定义命名空间,以便生成与 Java 代码相同的 UUID?
nameUUIDFromBytes
只接受一个参数,就像你说的那样应该是命名空间和名称的串联。命名空间参数应该是 UUID
,据我所知,它们没有定义 null
值。
一个“null
uuid”可以像这样传递给Python的uuid3
。只要命名空间具有 bytes
属性(使用 Python 2 和 3 进行测试),这就应该有效:
class NULL_NAMESPACE:
bytes = b''
uuid.uuid3(NULL_NAMESPACE, 'TTCCPSIVARSNFNVCRLPGTPEAICATYTGCIIIPGATCPGDYAN')
# returns: UUID('c6a0deb5-0c4f-3961-9d19-3f0fde0517c2')
在有帮助的情况下,如果你想做这方面的 Java,你可以使用以下内容:
UUID namespaceUUID = UUID.fromString("9db60607-6b12-41eb-8848-eafd26681583");
String myString = "sometextinhere";
ByteBuffer buffer = ByteBuffer.wrap(new byte[16 + myString.getBytes().length]);
buffer.putLong(namespaceUUID.getMostSignificantBits());
buffer.putLong(namespaceUUID.getLeastSignificantBits());
buffer.put(myString.getBytes());
byte[] uuidBytes = buffer.array();
UUID myUUID = UUID.nameUUIDFromBytes(uuidBytes);
这将提供与以下相同的输出 UUID Python:
namespaceUUID = UUID('9db60607-6b12-41eb-8848-eafd26681583')
myUUID = uuid.uuid3(myUUID, 'sometextinhere'))
@turbomeri 的回答是正确的..只是 python 代码没有几个错误,所以更正了版本
a = 'sometextinhere'
namespaceUUID = uuid.UUID('9db60607-6b12-41eb-8848-eafd26681583')
print(str(uuid.uuid3(namespaceUUID, a)))```
在 Java 中创建应用程序文件,其中文件名是从使用函数 UUID.nameUUIDFromBytes
创建的蛋白质序列(例如 TTCCPSIVARSNFNVCRLPGTPEAICATYTGCIIIPGATCPGDYAN)生成的 UUID。这导致 UUID c6a0deb5-0c4f-3961-9d19-3f0fde0517c2
.
UUID.namedUUIDFromBytes
不将名称空间作为参数,而在 python uuid.uuid3
中是。根据 What namespace does the JDK use to generate a UUID with nameUUIDFromBytes?,名称空间应该作为名称的一部分传递,但不再可能更改 java 代码。
有没有办法在 python 代码中创建自定义命名空间,以便生成与 Java 代码相同的 UUID?
nameUUIDFromBytes
只接受一个参数,就像你说的那样应该是命名空间和名称的串联。命名空间参数应该是 UUID
,据我所知,它们没有定义 null
值。
一个“null
uuid”可以像这样传递给Python的uuid3
。只要命名空间具有 bytes
属性(使用 Python 2 和 3 进行测试),这就应该有效:
class NULL_NAMESPACE:
bytes = b''
uuid.uuid3(NULL_NAMESPACE, 'TTCCPSIVARSNFNVCRLPGTPEAICATYTGCIIIPGATCPGDYAN')
# returns: UUID('c6a0deb5-0c4f-3961-9d19-3f0fde0517c2')
在有帮助的情况下,如果你想做这方面的 Java,你可以使用以下内容:
UUID namespaceUUID = UUID.fromString("9db60607-6b12-41eb-8848-eafd26681583");
String myString = "sometextinhere";
ByteBuffer buffer = ByteBuffer.wrap(new byte[16 + myString.getBytes().length]);
buffer.putLong(namespaceUUID.getMostSignificantBits());
buffer.putLong(namespaceUUID.getLeastSignificantBits());
buffer.put(myString.getBytes());
byte[] uuidBytes = buffer.array();
UUID myUUID = UUID.nameUUIDFromBytes(uuidBytes);
这将提供与以下相同的输出 UUID Python:
namespaceUUID = UUID('9db60607-6b12-41eb-8848-eafd26681583')
myUUID = uuid.uuid3(myUUID, 'sometextinhere'))
@turbomeri 的回答是正确的..只是 python 代码没有几个错误,所以更正了版本
a = 'sometextinhere'
namespaceUUID = uuid.UUID('9db60607-6b12-41eb-8848-eafd26681583')
print(str(uuid.uuid3(namespaceUUID, a)))```