2

我需要在 Java 中生成唯一数量的 32 位。我需要将数字作为接口要求的 Java int 返回。你能分享一些关于这个的想法吗?

该数字将用作 MySQL PK,并且多个线程可以同时生成自己的唯一 ID。(抱歉决定不使用MySQL增量id)

我尝试了 UUID 类,但它生成的数据似乎比我可以使用的多。

我发现了这个,但不确定它是否有效:

    // seems no way to get int
    UUID id = UUID.randomUUID();
    System.out.println(id);

    // not working either?
    java.rmi.server.UID uid = new java.rmi.server.UID();
    System.out.println(uid.toString());

    // the one i am using
    SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
    prng.setSeed(System.currentTimeMillis());
    int ret = prng.nextInt();
    System.out.println(ret);
4

3 回答 3

5

你想要多“独特”?简而言之,什么是碰撞域?如果您正在处理数千个密钥,那么Random.nextInt()与您尝试使用版本 4 UUID(UUID v4 生成 128 个随机位)相比,完全符合您的要求。

如果你需要一些碰撞几率较小的东西,那么你需要一个全局递增的整数,但这里需要非常小心,例如保持 JVM 启动之间的状态。为此,您应该查看AtomicIntegers

于 2010-12-10T04:37:36.663 回答
0

SecureRandom方法很好,但不要在上面设置种子。它将以(可能)安全的方式选择它自己的种子。

您也可以使用 UUID 并丢弃不需要的位,例如

int key = (int)UUID.randomUUID().getLeastSignificantBits();

编辑:您还应该知道.SecureRandom明显慢于Random. 既然你不在这里做加密,为什么不使用Random

于 2010-12-10T04:34:54.307 回答
0

我认为您可以使用 32 位哈希函数。详细信息在以下教程中给出 http://www.concentric.net/~ttwang/tech/intash.htm

private static int hash(int key){

          key = ~key + (key << 15); // key = (key << 15) - key - 1;
          key = key ^ (key >>> 12);
          key = key + (key << 2);
          key = key ^ (key >>> 4);
          key = key * 2057; // key = (key + (key << 3)) + (key << 11);
          key = key ^ (key >>> 16);
          return key;

    }
于 2010-12-10T04:35:40.750 回答