从 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)))```