2017-02-22 1 views
1

내 애플리케이션의 고유 ID 생성기로 Snowcast https://github.com/noctarius/snowcast을 사용하려고합니다. 이 ID를 웹 응용 프로그램 URL에 노출합니다.Hazelcast Snowcast 시퀀스 생성기 신기원 ID 길이

는 지금은 어떻게 내 봄 부팅 응용 프로그램과 함께 Snowcast 시퀀서를 구성하는 두 가지 옵션이 있습니다 :

@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); 
} 

또는 Calendar 기반 시대의 경우 snowcastSequencer.next() 메소드 호출의 결과로

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

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

나는 다음과 같은 긴 가치를 얻고 있습니다 :

15617925960433665 

하지만 Date 기반 시대의 경우 :

12046041089 

내가 두 번째처럼 ... 짧은 ID에 더 관심이 있어요하지만 난 ID가 가능한 고유성 문제에 대해 우려하고있다.

고유 ID의 경우 날짜를 기준으로 에포크를 사용해도 되겠습니까?

답변

1

숫자가 생성되는 방식을 보면 하나의 ID가 여러 부분으로 구성되어 있기 때문에 더 짧거나 긴 ID가 없음을 알 수 있습니다. 타임 스탬프는 그 중 하나 일뿐입니다. 그것은 신기원 (처음 몇 비트)에 대한 오프셋이 증가함에 따라 ID가 시간의 경과에 따라 변할 것이라고 말했습니다. 어떤 시점에서 모든 비트 (가장 높은 비트조차도)가 사용되기 때문에 long 값은 Java의 포인트에서 음수 값으로 전환되고 음수로 보일 것입니다 (또는 부호없는 long으로 인쇄해야합니다. biginteger).

어쨌든 짧거나 길지는 않지만 신기원 오프셋 (신기원이 시작된 이래로 몇 밀리가 경과했는지) 및 단일 밀리 초 안에 노드/ID의 수에 따라 달라집니다.

PS : 앱 실행 시간 동안 고유 ID를 생성하는 경우 모두 완벽합니다.

+0

답장을 보내 주셔서 감사합니다. 바로 지금 생각해야하거나 내 URL에 부정적인 가치가 괜찮습니다 .. – alexanoid

+0

거기에 어떤 방법으로 부정적인 값 생성을 피하기 위해 무엇입니까? 내 솔루션은 음수 값을 허용 할 수 없습니다. ( – alexanoid

+0

아니요 유감스럽게도 가능한 것은 아닙니다. 최상위 비트가 에포크 밀리 초에 사용되므로 항상 음수 값을 가질 가능성이 있습니다. – noctarius