2017-02-22 4 views
1

Я собираюсь использовать Snowcast https://github.com/noctarius/snowcast как уникальный генератор идентификаторов для моего приложения. Я собираюсь предоставить эти идентификаторы в URL-адресах веб-приложения.Hazelcast Генерация последовательности последовательностей снегового генератора и длина id

Сейчас у меня есть два варианта, как настроить Snowcast секвенсор с моей Spring приложения загрузки:

@Bean 
public SnowcastSequencer snowcastSequencer(Snowcast snowcast) { 
    Calendar calendar = GregorianCalendar.getInstance(); 
    calendar.set(2017, Calendar.FEBRUARY, 1, 0, 0); 
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(calendar.getTimeInMillis()); 

    return snowcast.createSequencer("sequence_generator", snowcastEpoch); 
} 

или

@Bean 
public SnowcastSequencer snowcastSequencer(Snowcast snowcast){ 
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime()); 

    return snowcast.createSequencer("sequence_generator", snowcastEpoch); 
} 

в результате snowcastSequencer.next() вызова метода в случае Calendar на основе эпохи Я получаю следующую длинную величину:

15617925960433665 

но в случае Date на основе эпохи:

12046041089 

Я больше заинтересован в более короткие идентификаторы .. как второй, но я беспокоиться о возможной уникальности идентификаторов вопроса.

Не могли бы вы рассказать или это нормально использовать эпоху на основе даты в случае уникальных идентификаторов?

ответ

1

Если вы посмотрите, как эти числа сгенерированы, вы увидите, что идентификатор короче или длиннее, поскольку один идентификатор состоит из нескольких частей. Временная метка - всего лишь один из них. При этом идентификаторы будут меняться с течением времени, так как смещение к эпохе (первые несколько бит) будет увеличиваться. В какой-то момент значение long переключится на отрицательные значения из точки Java, поскольку все биты используются (даже самый старший бит), и он начнет выглядеть отрицательным (или вам нужно напечатать его как unsigned long, поместить его в biginteger).

В любом случае, нет такой вещи, как короткая или длинная, но она зависит от смещения эпохи (сколько миллисов прошло с начала эпохи) и количества узлов/идентификаторов за одну миллисекунду.

PS: в случае просто генерации уникальных идентификаторов в течение времени выполнения приложений оба отлично.

+0

Спасибо за ваш ответ! Прямо сейчас я должен думать или нормально иметь отрицательные значения на моих URL-адресах. – alexanoid

+0

есть ли способ избежать генерации отрицательных значений? Мое решение не может принимать отрицательные значения (( – alexanoid

+0

Нет, мне жаль, что это невозможно, поскольку самый верхний бит используется для эпохальных миллисов, и таким образом всегда есть возможность иметь отрицательные значения. – noctarius

Смежные вопросы