Java에서 가장 중요한 비트를 사용하여 충돌 가능성
문제
내가 사용하는 경우 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은 이것에 대한 훌륭한 블로그 게시물을 가지고 있습니다.
나는 이것이 RandomUuid를 사용하는 가장 좋은 예라고 생각합니다.
임의의 긴 값을 생성하는 것이 좋습니다. 그러면 모든 비트는 무작위입니다. 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();
}