如何在Java中获得与uint32_t对应的唯一值?

时间:2017-01-22 23:48:34

标签: java c++ multithreading thread-safety atomicinteger

我必须在Java中生成一个唯一的数字(对于运行代码的机器),以便在C ++中它可以对应uint32_t。通常,其他C ++程序应该能够正确地读取此唯一编号uint32_t。我在一个字节数组中发送此信息,其他C ++程序正在对其进行反序列化以获取此数字。到目前为止,我无法在C ++程序中更改此数字的数据类型。

  private static final AtomicInteger clientId = new AtomicInteger(0);

  // will be called many time when the program is running after initialization
  public static int getClientId() {
    int counter = clientId.incrementAndGet();
    return counter == Integer.MAX_VALUE ? 0 : counter;
  }

  // called only once at startup
  public static void setClientId(final int counter) {
    clientId.addAndGet(counter == Integer.MAX_VALUE ? 0 : counter);
  }

所以我想出了上面的代码。在应用程序启动(初始化阶段)期间,我的setClientId方法只会被调用一次:

  • 如果本机首次运行代码,就像它是新机器一样,那么我会将0传递给setClientId方法。
  • 如果这台机器已经运行了代码,但我们重新启动了服务器,那么我将在数据库中查找这台机器的最后保存值(因为我们每隔几分钟也会在db中保存这个值)然后我会将该值传递给setClientId方法。

然后在我的程序运行时(初始化之后),它将继续调用getClientId方法给我实际的唯一clientId。

这是为我的机器生成唯一ID的正确方法,对于C ++程序,它将是uint32_t吗?我也确保如果值达到Integer.MAX_VALUE,则将其设置为0并重新开始。我必须这样做吗?或者我也可以为这个uint32_t

取负值

基本上,我想为我的机器生成一个唯一的编号,该编号应始终与uint32_t相对应。如果机器是一台新机器,我们可以从数字0开始(当我们查找这台机器的数值时,bcoz数据库,那里没有任何值,所以我们将从0开始)但是如果机器已经运行了这个之前的代码,然后从数据库中最后保存的值开始。

1 个答案:

答案 0 :(得分:1)

  

我必须这样做吗?或者我也可以为这个uint32_t取负值?

不,你不必,你也可以采取负值。如果将Java整数逐位传递给C ++,那么即使Java变量超过最大值并且变为负数,C ++中的unit32_t也会继续增加。这是2补码有符号整数的好处,这是Java用来表示整数值的东西。

这是一个4位示例,说明了发生的事情:

Bits  Unsigned  Signed
0000         0       0
0001         1       1
0010         2       2
0011         3       3
0100         4       4
0101         5       5
0110         6       6
0111         7       7
1000         8      -8
1001         9      -7
1010        10      -6
1011        11      -5
1100        12      -4
1101        13      -3
1110        14      -2
1111        15      -1

另请参阅此答案:What happens when you increment an integer beyond its max value