List<String> list = new ArrayList<String>();
for (int i = 0; i < 10000; i++) {
String value = (""+UUID.randomUUID().getLeastSignificantBits()).substring(3, 20);
assertFalse(list.contains(value));
assertTrue(value.length() < 18);
list.add(value);
}
이 방법은 마법처럼 통과를 말한다. 그리고 나는 가장 중요한 것보다는 중요한 비트를 취하는 것이 약간 낫다는 인상을 받고있다. 왜냐하면 가장 중요한 비트에서 일부 정보에 대해서는 6 비트가 고정되어 있고 중요하지는 않은 경우가 있기 때문입니다. 따라서 평균적으로 우리는 가장 중요한 비트와의 충돌을 얻기 위해 2^29 UUID를 생성해야하지만, 최하위 비트는 2^32 개의 UUID를 생성해야합니다. Ref : SO Thread. 내가 그 가정에 맞습니까?
이제 여기에서 메소드에서 얻은 최하위 비트의 최상위 2 자리를 자르고 있습니다. 그 부분 문자열을 사용하고 있습니다. 주의 사항 2 자리 숫자와 부호 비트를 잘라내는 중입니다. 이제 평균적으로 충돌을 얻기 위해 2^31 UUID를 생성해야한다는 의미는 아닙니까?
정확히 17 자리 길이를 초과하지 않아야하는 고유 식별자를 생성하려고합니다. 그리고 자바 타입의 의미가 아닌 정수 여야합니다. 내 접근 방식은 얼마나 신뢰할 수 있습니까?
메타 정보 : 사실
, 우리는 일부 레거시 시스템과의 통합, 그리고 우리는 몇 가지 고유 번호 이상 17 자리를 입력해야합니다. 그들은 데이터베이스 고유 키로 생각하고 있습니다. 이 경우에도 시퀀스를 사용할 수 있으며, 먼저이를 제안했습니다. 그러나 그들은 대신에 난수를 생각해 내면 좋다고 말했습니다. 그래서 소비자는 짐작할 수 없습니다.
Java에서 UUID의 유형 -4 구현에 관해서는 충돌을 얻기 위해 평균 2^61 UUID를 생성해야합니다. 이것은 우리가 2^32를 생성하여 가장 중요한 비트에서 충돌을 얻고, 2^29를 생성하여 가장 중요한 비트에서 충돌을 가져와야 함을 의미합니까? 그렇다면 우리가 평균 2^31을 생성하여 2를 자르고 대부분의 자릿수를 남긴 후 최하위 비트에 충돌을 일으킬 필요가 있다고 가정하는 것이 올바르지 않습니까?
나는 SecureRandom
도 사용하려고 시도했지만, 19 자리 길이의 값을 주었다. 그러므로 나는 그것의 자리까지 잘게 자른다. 아래는 그 코드입니다. 내가 생각할 수있는
List<String> list = new ArrayList();
Random random = new SecureRandom();
for (int i = 0; i < 10000; i++) {
String value = ""+random.nextLong().substring(2, 19);
assertFalse(list.contains(value));
assertTrue(value.length() < 18);
list.add(value);
}
다른 옵션은 형식 "yyMMddHHmmssSSS
+ 2-SEQ 자리"날짜를 사용하는 것입니다. 하지만 그건 프로세서 의존적 일 것이고 추측 할 만하다. 왜냐하면 99 라운드 이후에 밀리 초 단위로 변화가 일어 났는지 확신 할 수 없기 때문입니다. 내가 하겠지만 프로세서 속도에 달려있다. 99 개의 동시 요청은 거의 발생하지 않습니다.
실제 질문은 무엇입니까? –
알았어 물음표를 달고있다. 미안합니다. –