从python中的java代码重现uuid

时间:2015-01-14 09:14:37

标签: java python uuid

在Java应用程序中创建文件,其中文件名是从使用函数UUID.nameUUIDFromBytes创建的蛋白质序列(例如TTCCPSIVARSNFNVCRLPGTPEAICATYTGCIIIPGATCPGDYAN)生成的UUID。这会产生UUID c6a0deb5-0c4f-3961-9d19-3f0fde0517c2

UUID.namedUUIDFromBytes没有将命名空间作为参数,而在python uuid.uuid3中则没有。根据{{​​3}},命名空间应该作为名称的一部分传递,但它不再可能更改java代码。

有没有办法在python代码中创建自定义命名空间,以便它生成与Java代码相同的UUID?

2 个答案:

答案 0 :(得分:11)

nameUUIDFromBytes只接受一个参数,它应该是命名空间和名称的串联,就像你说的那样。 namespace参数应该是UUID,据我所知,他们没有定义null值。

A" 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')

答案 1 :(得分:2)

如果它有用,如果你想做这方面的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);

这将提供与以下Python相同的输出UUID:

namespaceUUID = UUID('9db60607-6b12-41eb-8848-eafd26681583')
myUUID = uuid.uuid3(myUUID, 'sometextinhere'))