如何在Java中获得与uint32_t对应的唯一值
How to get a unique value in Java that corresponds to uint32_t?
我必须在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
也可以看看这个答案:当你把一个整数的增量超过它的最大值时会发生什么。
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 RTTI 克隆唯一指针的向量
- 如何在 c++ 中迭代数组中的唯一元素
- 为什么我无法创建唯一指针
- 堆分配的对象是否存在永不为空的唯一所有者?
- 容器,其中每个项可以有多个非唯一键 (c++17)
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?