2017-01-22 9 views
1

Мне нужно создать уникальный номер в Java (для моей машины, на которой работает код), так что в C++ он может соответствовать uint32_t. В общем, другая программа на C++ должна иметь возможность правильно прочитать этот уникальный номер как uint32_t. Я отправляю эту информацию в массив байтов, который другая программа на С ++ десериализует его, чтобы получить это число. Я не могу изменить тип данных для этого числа в программе на C++.Как получить уникальное значение в Java, которое соответствует uint32_t?

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.

Это правильный способ создания уникального идентификатора для моей машины, который будет uint32_t для программы на C++? Я также уверен, что если значение достигнет Integer.MAX_VALUE, установите его на 0 и начните заново. Должен ли я это делать? Или я могу принять отрицательные значения для этого uint32_t?

В принципе, я хочу создать уникальный номер для моей машины, который всегда должен соответствовать uint32_t. Если машина является новой машиной, мы можем начать с номера 0 (bcoz, когда мы посмотрим на значение для этой машины, db, не будет никакого значения, поэтому мы начнем с 0), но если машина уже запускала этот код до , затем начните с того, что было последним сохраненным значением в базе данных.

+0

Целые числа Java подписаны, если вы хотите полный диапазон, вы также должны принимать отрицательные значения. –

+0

Значит, 'uint32_t' сможет понять отрицательные целые значения? Простите мое невежество для C++ здесь. – john

+0

Это будет проблемой только в том случае, если вы ожидаете генерировать более 2,147,483,647 уникальных идентификаторов. Но если вы сериализуете подписанный Java 'int' (который может быть отрицательным) в виде четырех байтов и десериализуйте эти 4 байта в вашей программе на C++ как' uint32_t', программа C++ увидит отрицательные целые числа Java как целые числа в диапазоне 2147483648 4294967295. – ajb

ответ

1

Должен ли я это сделать? Или я могу принять отрицательные значения для этого uint32_t?

Нет, вам не обязательно, и вы можете принимать отрицательные значения. Если вы передадите целое число Java в C++ по-бит, unit32_t в C++ будет продолжать расти, даже когда переменная 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 

Также см этот ответ: What happens when you increment an integer beyond its max value.

+0

Я вижу .. так как же мой метод выглядит как для get и set? Думаю, тогда мне больше не нужна эта проверка максимального значения. – john

+0

IMHO проверка максимального значения просто ограничивает значение счетчика неотрицательным. Если вы отбросите чек, переменная все равно обернется (только медленнее). –

+0

Другой вопрос: вы получаете дубликаты, когда обходите (да, это очень длинная последовательность, но все же ...) –