Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中创建64位唯一整数_Java_Random_64 Bit_Long Integer_Uuid - Fatal编程技术网

如何在Java中创建64位唯一整数

如何在Java中创建64位唯一整数,java,random,64-bit,long-integer,uuid,Java,Random,64 Bit,Long Integer,Uuid,我需要在Java中创建一个64位的唯一整数,这样冲突的可能性就低了。该系统不是分布式的,因此不同计算机之间的冲突不是问题 有没有办法,我们可以在Java中创建一个始终唯一的64位整数 到目前为止,我正在使用- long number = System.nanoTime(); 这是在Java中生成64位唯一整数的正确方法,还是我可以尝试其他方法 更新:- 这样做怎么样?这会是独一无二的吗 UUID number = UUID.randomUUID(); long uniqueNumber = n

我需要在Java中创建一个64位的唯一整数,这样冲突的可能性就低了。该系统不是分布式的,因此不同计算机之间的冲突不是问题

有没有办法,我们可以在Java中创建一个始终唯一的64位整数

到目前为止,我正在使用-

long number = System.nanoTime();
这是在Java中生成64位唯一整数的正确方法,还是我可以尝试其他方法

更新:-

这样做怎么样?这会是独一无二的吗

UUID number = UUID.randomUUID();
long uniqueNumber = number.timestamp();

您希望以适当的方式获得唯一的ID(尽管是128位):

64位不太合适(可能发生冲突*):

UUID.getLeastSignificantBits();
UUID.getMostSignificantBits();
要真正获得唯一ID(如果它们对您的操作至关重要):

  • 使用所有ID的集中存储
  • 当你需要一个ID时,让这个集中的系统来处理它->DB和自动递增的值通常是最简单的方法
  • *碰撞=>2个或更多相等的值使用a以确保存储的值的唯一性。然后,您可以通过检查返回的内容来检查插入是否成功。如果这些值必须是“随机”的,你可以使用你自己的算法,或者检查


    正如
    Marc B
    所说,最好的方法是简单的
    long
    ,它用零初始化,每次需要新值时递增

    如果您需要并发,或者如果性能根本不是问题,那么您可以使用
    locha
    建议的
    AtomicLong
    ;但是,如果您真的需要它是一个long而不是int,那么我怀疑您将要生成很多,因此您可能应该避免
    AtomicLong
    的额外开销,除非您确定还需要并发性

    System.nanoTime()
    不是一个好主意,因为您无法保证对它的两个连续调用总是会产生不同的值

    编辑(涵盖有问题的更新)


    不,UUID的时间戳部分不保证唯一,原因与System.nanoTime()不保证唯一完全相同。如果UUID的时间戳是唯一的,那么就不需要UUID类型,我们将始终使用该时间戳部分。要保证唯一性,时间总是一个不好的方法。

    如果您需要在一个进程中保持数字的唯一性,在重启之间保持稳定,那么您可以使用一个简单的原子长度和一个计时器

    private static final AtomicLong TS = new AtomicLong();
    public static long getUniqueTimestamp() {
        long micros = System.currentTimeMillis() * 1000;
        for ( ; ; ) {
            long value = TS.get();
            if (micros <= value)
                micros = value + 1;
            if (TS.compareAndSet(value, micros))
                return micros;
        }
    }
    
    private static final AtomicLong TS=new AtomicLong();
    公共静态长getUniqueTimestamp(){
    长微秒=System.currentTimeMillis()*1000;
    对于(;;){
    长值=TS.get();
    
    如果(micros sure.
    i=0
    ,那么无论何时你需要一个新的,那么
    i++
    。这里你说的碰撞机会是什么意思?@MarcB或者从
    Long.MIN\u值开始,使它持续的时间更长得可笑。因为
    nanoTime()
    将以纳秒为单位给出时间,这似乎非常独特。然后您可以执行
    Integer unique64Integer=(int)number;
    @Ascalonian除非使用泛型,否则永远不要使用
    Integer
    ,再加上
    int
    s是32位的…真的是一个很好的解决方案!如果你想保证唯一的键,哈希表是一种方法,OP。如果他需要它是长的而不是int,那么他显然会生成数百万个,所以哈希集是完整的除了测试之外,任何目的都不可能实现。此外,这不是问题的答案。我认为您的第一点是OP的选择问题。OP可能会增加一个long,或者OP需要一个fast(通常为O(1),最坏情况下为O(logn))一种在插入时检查值唯一性的方法。如果只需要在JVM中是唯一的,则可以使用AtomicLong而不是HashSet。这样做怎么样?
    UUID number=UUID.randomUUID();long uniqueNumber=number.timestamp()
    这是唯一的吗?如果你想使用时间戳,那么你的原始解决方案会更好。这一切都取决于你的用例。你需要这个值的频率有多高,你会同时运行多个实例?此外,这个值是你非常依赖的吗?UUID的子序列没有constr的唯一性保证UCION!(例如,如果您使用版本1 UUID,则前64位仅为时间戳和常量)。如果您需要小于128位的UID,则需要探索不同的算法(IEEE的EID-64、Twitter的雪花等)。谢谢你的建议。在你的例子中,什么是micro?它是
    micro
    ,对吗。@david micro-seconds.ohkk知道了。看起来你的建议中有一个类型。你正在使用
    micro
    并初始化
    micro
    Long getUniqueNumber(HashSet uniqueNumberSet) {
        Long unique = generateUniqueNumber();
        if(!uniqueNumberSet.add(unique)) { // handle collision }
        return unique;
    }
    
    private static final AtomicLong TS = new AtomicLong();
    public static long getUniqueTimestamp() {
        long micros = System.currentTimeMillis() * 1000;
        for ( ; ; ) {
            long value = TS.get();
            if (micros <= value)
                micros = value + 1;
            if (TS.compareAndSet(value, micros))
                return micros;
        }
    }