문제

내가 사용하는 경우 Long uuid = UUID.randomUUID().getMostSignificantBits() 충돌을 일으킬 가능성이 얼마나 듭니다. 가장 중요한 비트를 잘라 내기 때문에 충돌을 일으킬 가능성이 있습니다.

도움이 되었습니까?

해결책

에 따르면 문서, 정적 방법 UUID.randomUUID() 유형 4 UUID를 생성합니다.

이는 일부 유형 정보에 6 비트가 사용되며 나머지 122 비트는 무작위로 할당됩니다.

6 개의 비 랜덤 비트는 UUID의 가장 중요한 절반에서 4 개, 최소한의 절반은 4 개로 분포됩니다. 따라서 UUID의 가장 중요한 절반에는 60 비트의 무작위성이 포함되어 있기 때문에 충돌을 받기 위해 평균적으로 2^30 UUID를 생성해야합니다 (전체 UUID의 경우 2^61에 비해).

그래서 나는 당신이 다소 안전하다고 말할 것입니다. 그러나 Carl Seleborg가 언급 한 것처럼 이것은 다른 유형의 uuids에게는 전혀 사실이 아닙니다.

또한 UUID의 가장 중요한 절반을 사용하여 약간 더 나을 것입니다 (또는 Securerandom을 사용하여 임의의 긴 길이를 생성).

다른 팁

Raymond Chen은 이것에 대한 훌륭한 블로그 게시물을 가지고 있습니다.

안내는 전 세계적으로 독특하지만 Guid의 하위 문자열은 아닙니다.

나는 이것이 RandomUuid를 사용하는 가장 좋은 예라고 생각합니다.

http://www.javapractices.com/topic/topicaction.do?id=56

임의의 긴 값을 생성하는 것이 좋습니다. 그러면 모든 비트는 무작위입니다. Java 6에서 New Random ()는 System.Nanotime ()와 카운터를 종자로 사용합니다.

독창성에는 다른 수준이 있습니다.

많은 컴퓨터에서 독창성이 필요한 경우 고유 한 ID를 할당하거나 고유 한 ID 배치를 할당하기위한 중앙 데이터베이스 테이블을 가질 수 있습니다.

하나의 앱에서 독창성이 필요한 경우, 요구 사항에 따라 CurrentTimeMillis ()*1000 또는 Nanotime ()에서 시작하는 카운터 만 가질 수 있습니다.

시간을 사용하십시오 YYYYDDDD (연도 + 일) 접두사로서. 이것은 테이블 및 인덱스의 데이터베이스 단편화를 감소시킵니다. 이 메소드가 반환됩니다 byte[40]. Active Directory가 Sid (varbinary(85))는 LDAP 사용자의 키이며 응용 프로그램 자동 생성 ID는 비 LDAP 사용자에게 사용됩니다. 또한 거래 테이블 (은행 산업)에서 하루에 많은 수의 거래는 표준을 사용할 수 없습니다. Int 키 유형

private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");

public static byte[] getSidWithCalendar() {
    Calendar cal = Calendar.getInstance();
    String val = String.valueOf(cal.get(Calendar.YEAR));
    val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
    val += UUID.randomUUID().toString().replaceAll("-", "");
    return val.getBytes();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top