当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建5类UUID?

庞乐池
2023-03-14

在python中,要生成5类UUID,我们只需执行以下操作:

import uuid
print uuid.uuid5(uuid.NAMESPACE_URL, 'my string')

查看java留档java.util.UUID,我不知道该怎么做。首先,没有提到类型5。他们确实有一个类型3,但签名是:

 nameUUIDFromBytes(byte[] name)
 Static factory to retrieve a type 3 (name based) UUID based on the specified byte array.

如何在Java中创建5类UUID?

共有2个答案

郭建华
2023-03-14

在这种情况下,其他人需要一个生成版本5 UUID的库。

UUID uuid = UuidCreator.getNameBasedSha1("google.com");
UUID uuid = UuidCreator.getNameBasedSha1(UuidCreator.NAMESPACE_URL, "google.com");

https://github.com/f4b6a3/uuid-creator

轩辕晔
2023-03-14

您可以按照https://stackoverflow.com/a/28776880/1452094.提出的代码自己实现它,但是这确实需要一些改动,因为j.u.UUID构造函数需要很长时间。

Java 8开始,标准库似乎不支持类型5。但是像“Apache Commons Id”这样的第三方库确实有支持它的UUID实现。

编辑:这是一个功能齐全的实现:

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
import java.util.UUID;

public class UUIDType5 {
    private static final Charset UTF8 = Charset.forName("UTF-8");
    public static final UUID NAMESPACE_DNS = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
    public static final UUID NAMESPACE_URL = UUID.fromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8");
    public static final UUID NAMESPACE_OID = UUID.fromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8");
    public static final UUID NAMESPACE_X500 = UUID.fromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8");

    public static UUID nameUUIDFromNamespaceAndString(UUID namespace, String name) {
        return nameUUIDFromNamespaceAndBytes(namespace, Objects.requireNonNull(name, "name == null").getBytes(UTF8));
    }

    public static UUID nameUUIDFromNamespaceAndBytes(UUID namespace, byte[] name) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-1");
        } catch (NoSuchAlgorithmException nsae) {
            throw new InternalError("SHA-1 not supported");
        }
        md.update(toBytes(Objects.requireNonNull(namespace, "namespace is null")));
        md.update(Objects.requireNonNull(name, "name is null"));
        byte[] sha1Bytes = md.digest();
        sha1Bytes[6] &= 0x0f;  /* clear version        */
        sha1Bytes[6] |= 0x50;  /* set to version 5     */
        sha1Bytes[8] &= 0x3f;  /* clear variant        */
        sha1Bytes[8] |= 0x80;  /* set to IETF variant  */
        return fromBytes(sha1Bytes);
    }

    private static UUID fromBytes(byte[] data) {
        // Based on the private UUID(bytes[]) constructor
        long msb = 0;
        long lsb = 0;
        assert data.length >= 16;
        for (int i = 0; i < 8; i++)
            msb = (msb << 8) | (data[i] & 0xff);
        for (int i = 8; i < 16; i++)
            lsb = (lsb << 8) | (data[i] & 0xff);
        return new UUID(msb, lsb);
    }

    private static byte[] toBytes(UUID uuid) {
        // inverted logic of fromBytes()
        byte[] out = new byte[16];
        long msb = uuid.getMostSignificantBits();
        long lsb = uuid.getLeastSignificantBits();
        for (int i = 0; i < 8; i++)
            out[i] = (byte) ((msb >> ((7 - i) * 8)) & 0xff);
        for (int i = 8; i < 16; i++)
            out[i] = (byte) ((lsb >> ((15 - i) * 8)) & 0xff);
        return out;
    }
}

为了验证它是否有效,我运行了以下代码:

public static void main(String[] args) {
    UUID test = UUIDType5.nameUUIDFromNamespaceAndString(NAMESPACE_URL, "google.com");
    System.out.println(test);
    System.out.println(test.version());
}

这产生了输出:

联邦传真3-8f5c-5189-80e6-f563dd1cb8f9

5

根据官方的python实现进行了验证:

联邦传真3-8f5c-5189-80e6-f563dd1cb8f9

 类似资料:
  • 所以lv在“v”或“v”后面会有一个“_”,在那之后会有一个整数,比如“_v1”,“_v2”,所以在结尾会是一个整数,但不是任何整数,它应该是整数a。谢谢!

  • 我正在创建JavaMailSender的bean类,并自动拥有javamailsender,但我得到错误 我不能为bean id="mail Sender"创建bean类。我在过去的两天里一直在努力,请让我离开它。 和错误页 组织。springframework。豆。工厂BeanCreationException:创建名为“employeeController”的bean时出错:自动连线依赖项的注

  • 问题内容: 在搜索如何通过API创建Kafka主题时,我在Scala中找到了以下示例: 最后一个arg 显然是Scala对象。我不清楚如何使该示例在Java中工作。 这篇文章如何在Clojure中创建Scala对象的问题在Clojure中提出了相同的问题,答案是: 我认为Java中的翻译成: 但是,当我尝试使用该方法(或其他任何数量的变体)时,它们都无法编译。 编译错误是: 我正在使用kafka_

  • 问题内容: 他们如何在Java中创建代理。他们是根据需要创建代理,还是创建代理并将其永久保存。 问题答案: 您可以通过两种基本方式创建代理: 通过接口使用JDK机制。看一看。 在具体的类上使用一些字节码生成/操作库。看看cglib和javassist Apache有一个很好的实用程序:commons- proxy 。它包装了许多用于创建代理的机制和框架。 这全部与动态代理有关,即在运行时创建的代理

  • 问题内容: 我想创建一个二维数组,每个单元格都是一个! 我认为这是定义,但我不能在其中添加任何内容,这些定义是真的吗? 要么 请帮我 问题答案: 我想创建一个二维数组,每个单元格都是一个ArrayList! 如果要创建一个2D 数组 ,则可以执行以下操作:

  • 问题内容: 我正在尝试在Java中创建一个nullalble对象,但不知道如何执行此操作,在C#中将这样完成 这使我可以检查是否为null,而在某些情况下,我可以使用0值,但这并不总是可能的,因为某些执行路径允许使用0值 问题答案: 我不确定您想要什么,但是如果您想要一个也可以声明的整数值,则可能要使用该类: 有对应的类每个基元:,,,,等。“标准库”数字类的所有扩展类。 请注意,自JDK 1.5