0

任何人都可以建议我是否使用下面的代码为我的文件生成 id,它是否总是唯一的。由于 100s 表单会自动创建表单,并在 ID 文本框中自动填充 ID。所以它应该是线程安全的,如果我重新启动应用程序,它不应该重复在应用程序停止之前已经生成的 id。

  private static final AtomicLong count = new AtomicLong(0L);  
    public static String generateIdforFile()  
    {
        String timeString = Long.toString(System.currentTimeMillis(), 36);
        String counterString = Long.toString(counter.incrementAndGet() % 1000, 36);
        return timeString + counterString;
    }

并且表单正在使用 ClassName.generateIdforFile(); 获取 Id;

4

3 回答 3

1

为什么不只使用 aUUID作为您的文件 ID?您可以使用以下内容:

public static String generateIdforFile()  {
    return UUID.randomUUID().toString();
}

或者你需要一个(持续的)数值吗?

如果数字必须是数字(而不是持续的),您可以使用UUID#getLeastSignificantBits()UUID#getMostSignificantBits()作为数值。

在 SO 上引用这个答案

因此,您的 UUID 的最重要的一半包含 58 位随机性,这意味着您平均需要生成 2^29 个 UUID 才能发生冲突(相比之下,完整 UUID 需要 2^61 个)。

您当然不会像使用完整 UUID 那样安全。

于 2013-10-14T09:27:27.277 回答
0

如果您将方法设为同步,则无需使用AtomicLong变量。

因为并发是通过使用同步关键字来保证的。

使用过多的并发变量会影响应用程序的效率和性能。

于 2013-10-14T08:18:06.683 回答
0

更好地为您的整个应用程序使用全局AtomicLong起点。0L然后你与CurrentTimeMillis.

static AtomicLong counter = new AtomicLong(0L);

public static String generateIdforFile()  
{
    String timeString = Long.toString(System.currentTimeMillis(), 36);
    String counterString = Long.toString(counter.incrementAndGet() % 1000, 36);
    return timeString + counterString;
}

这更有可能产生唯一 ID,即使在应用程序重新启动之间也是如此,前提是您的应用程序需要多于几毫秒才能关闭和重新启动。请注意,该方法不再同步。(不需要)并且还提供了,您在同一毫秒内创建的文件少于一千个。但是你不能保证普遍的唯一性。

于 2013-10-14T08:38:17.783 回答