Java에서 UUID의 최상위 비트를 사용한 충돌 가능성
사용하고 있다면Long uuid = UUID.randomUUID().getMostSignificantBits()
충돌할 가능성이 얼마나 되는지 알아내야 합니다.가장 중요하지 않은 부분을 잘라내기 때문에 충돌할 가능성이 있는 거죠?
문서에 따르면 정적 방법UUID.randomUUID()
UUID를 합니다.「 4 UUID 」 。
즉, 6비트가 일부 유형 정보에 사용되고 나머지 122비트가 랜덤하게 할당됩니다.
6개의 비랜덤비트는 UUID의 최상위 절반에 4개, 최하위 절반에 2개로 분산됩니다.따라서 UUID의 최상위 절반에는 60비트의 랜덤성이 포함되어 있습니다.즉, 평균적으로 2^30 UUID를 생성하여 콜리젼을 얻을 필요가 있습니다(풀 UUID의 경우는 2^61).
그래서 나는 네가 안전하다고 말하고 싶다.단, Carl Seleborg가 언급했듯이 다른 유형의 UUID에는 해당되지 않습니다.
덧붙여서 UUID의 최하위 절반을 사용하는 것(또는 SecureRandom을 사용하여 랜덤 롱을 생성하는 것)으로 약간 형편이 나아집니다.
Raymond Chen은 이에 대해 매우 훌륭한 블로그 투고를 하고 있습니다.
GUID는 글로벌하게 고유하지만 GUID의 하위 문자열은 고유하지 않습니다.
이것이 랜덤을 사용하는 가장 좋은 예라고 생각합니다.UUID:
http://www.javapractices.com/topic/TopicAction.do?Id=56
임의의 긴 값을 생성하는 것이 좋습니다.그러면 모든 비트가 랜덤입니다.Java 6에서는 새로운 Random()은 System.nanoTime()과 카운터를 시드로 사용합니다.
독특함에는 여러 가지 수준이 있습니다.
여러 머신에서 일의성이 필요한 경우 원하는 ID 또는 고유 ID 배치를 할당하기 위한 중앙 데이터베이스 테이블을 사용할 수 있습니다.
하나의 앱에 고유성이 필요한 경우 카운터(또는 요건에 따라 current Time Millis()*1000 또는 nano Time()에서 시작하는 카운터)만 있으면 됩니다.
Time (시간 사용)YYYYDDDD
년 + 요일이로 인해 테이블 및 인덱스의 데이터베이스 플래그멘테이션이 감소합니다.는 반환됩니다.byte[40]
SIDActive Directory SID)가 varbinary(85)
는 LDAP 이며, 프로그램의 사용자용으로 LDAP " " " " 。LDAP 이외의 사용자에게는 응용 프로그램 자동 생성 ID 가 사용됩니다. 테이블(는, 인 ,, 거, 거, 드, 드, 드, 드, 드, 드를 사용할 수 .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();
}
언급URL : https://stackoverflow.com/questions/325443/likelihood-of-collision-using-most-significant-bits-of-a-uuid-in-java
'it-source' 카테고리의 다른 글
Java 프로젝트의 패키지 구조? (0) | 2022.10.20 |
---|---|
JavaScript에서의 MD5 구현 속도 향상 (0) | 2022.10.20 |
인터페이스를 구현하는 Java 클래스 찾기 (0) | 2022.10.20 |
python의 루프에 대해 첫 번째 엔트리를 건너뛰시겠습니까? (0) | 2022.10.20 |
intXX_t와 int_fastXX_t의 차이점은 무엇입니까? (0) | 2022.10.20 |