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

How to get a unique value in Java that corresponds to uint32_t?

本文关键字:唯一 uint32 Java      更新时间:2023-10-16

我必须在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方法
  • 如果这台机器已经在运行代码,但我们重新启动了服务器,那么我会在数据库中查找这台机器最后保存的值(因为我们每隔几分钟就会将这个值保存在数据库中),然后我会将该值传递给setClientId方法

然后,当我的程序运行时(初始化后),它将继续调用getClientId方法,为我提供实际的唯一客户端ID。

这是为我的机器生成唯一id的正确方法吗?C++程序将使用uint32_t?我还确保,如果值达到Integer.MAX_VALUE,则将其设置为0,然后重新开始。我必须这么做吗?或者我也可以对这个uint32_t取负值?

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

我必须这样做吗?或者我也可以对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

也可以看看这个答案:当你把一个整数的增量超过它的最大值时会发生什么。