簡體   English   中英

如何在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方法。
  • 如果這台機器已經在運行代碼但我們重新啟動了服務器,那么我將在數據庫中查找這台機器上次保存的值是什么(因為我們也每隔幾分鍾將該值保存在 db 中),然后我將傳遞該值setClientId方法的值。

然后當我的程序運行時(初始化后)它會繼續調用getClientId方法來給我實際唯一的 clientId。

這是為我的機器生成唯一 id 的正確方法,對於 C++ 程序來說,它是uint32_t嗎? 我還確保如果該值達到Integer.MAX_VALUE則將其設置為 0 並重新開始。 我必須這樣做嗎? 或者我也可以為這個uint32_t取負值?

基本上,我想為我的機器生成一個唯一的編號,該編號應始終對應uint32_t 如果機器是一台新機器,我們可以從數字 0 開始(bcoz,當我們查找這台機器的值時,db,不會有任何值,所以我們將從 0 開始)但如果機器之前已經運行過這段代碼,然后從數據庫中最后保存的值開始。

我必須這樣做嗎? 或者我也可以為這個 uint32_t 取負值?

不,您不必這樣做,您也可以采用負值。 如果您將 Java 整數逐位傳遞給 C++,則 C++ 中的 unit32_t 將繼續增加,即使 Java 變量超過最大值並變為負數。 這是 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

另請參閱此答案: 當您將整數增加到超出其最大值時會發生什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM