使用移位运算符生成唯一数字,并按位和& java中的运算符

时间:2010-12-15 11:45:42

标签: java

我正在使用来自java的LEFT SHIFT运算符来生成一些唯一的数字,并使用bitwise&运营商如下。

// Number generation 

public final static long UNIQUE_NUMBER8 = (long) 1 << 8; 
public final static long UNIQUE_NUMBER9 = (long) 1 << 9; 
public final static long UNIQUE_NUMBER10 = (long) 1 << 10;

,直到

public final static long UNIQUE_NUMBER62 = (long) 1 << 62;

并验证相同,我正在使用以下条件, 其中request_number来自分配给的url url生成相同的数字 -

if ( request_number >= 0 && (request_number & UNIQUE_NUMBER10) != 0){
    System.out.println("Valid");
}else{
    System.out.println("Invalid");
}

但是使用上述条件我无法验证大于1的数字<&lt; 62, 因为正在使用的所有数字都在62以上,所以它将产生 再次使用已经被使用过的相同数字 因此按位&amp;条件失败。

请帮助我使用上述或类似逻辑生成唯一编号 并按位和&amp;和验证相同操作

由于

3 个答案:

答案 0 :(得分:3)

您检查该号码是否为否定数字。您只能设置0到62位,仍然是非负数。

也许你应该使用BitSet,你不需要所有的常量,你几乎可以有任意数量的位。

但是,要生成唯一ID,您可以创建UUID,也可以使用System.currentTimeMillis()(检查重复项)或仅使用AtomicLong.incrementAndGet(),具体取决于您需要的唯一ID类型。

这些方法通过始终增加用于生成id的数量来避免记住先前ID的需要。 UUID在系统中是唯一的但是相对简洁,即使系统重新启动(并且具有内置时间戳),currentTimeMillis也可以是唯一的,AtomicLong是最轻的,但是在系统启动时重新启动。

答案 1 :(得分:1)

每次有新请求时都可以生成UUID。将其添加到Set以检查是否已创建/使用它。因此,您拥有几乎无限数量的ID。

见这里:http://www.javapractices.com/topic/TopicAction.do?Id=56

答案 2 :(得分:0)

使用BitSet对您来说是更好的选择。