Java로 GUID 만들기


답변:


347

Java 5 이상에 번들로 제공되는 UUID 클래스를 살펴보십시오 .

예를 들면 다음과 같습니다.

  • 임의의 UUID를 원하는 경우 randomUUID 메소드를 사용할 수 있습니다 .
  • UUID를 특정 값으로 초기화하려면 UUID 생성자 또는 fromString 메소드를 사용할 수 있습니다 .

7
Kaleb Brasee와 같은 예를 포함하면 좋은 대답이 더 좋습니다.
Zero3

AndroidStudio 2.3 및 API 레벨 21 이상에서 작동합니다. 어쩌면 다시 돌아올 수도 있습니다.
raddevus

5
TL; DR ... "UUID UUID = UUID.randomUUID ();"
Aviram Fireberger

419

java.util.UUID.randomUUID();


2
반복을 반환 할 수 있습니까? Guid는 결코 반복하지 않기 때문에
angel

4
@angel 네, 이론적으로 UUID.randomUUID메소드가 복제본을 반환하는 것이 가능 하지만 이것은 실제로 현실적인 문제아닙니다 . Oracle / OpenJDK 구현은 강력한 암호화 난수 생성기를 사용합니다. 이를 감안할 때 UUID에 너무 많은 비트가 제공하는 천문학적 범위가 주어지면 앱에서 수백만 개의 이러한 값을 생성하고 여전히 잘 수 있습니다. 다른 변형 중 하나를 사용하면 "공간 및 시간", [1] MAC 주소 또는 이름 및 [2] 현재 날짜-시간을 제약 조건으로 사용하므로 충돌 가능성이 0에 더 가깝게 줄어 듭니다.
Basil Bourque

@RenniePet Eh, 당신이 편집증이고 새 ID를 만들 때 이미 사용 된 ID 목록에 액세스 할 수 있다면 목록에없는 ID while를 얻을 때까지 새 ID를 생성 합니다.
Nyerguds

2
Oracle 암호화 난수 생성기는 일반적으로 난수가있는 PRNG입니다. 랜덤 시드는 일반적으로 OS가 제공하는 "엔트로피"소스를 사용하여 얻습니다. 해당 소스를 저하 시키거나 손상시킬 수있는 경우 암호화 난수 생성기가 동일한 수를 생성 할 가능성이 높아집니다. 또한 일부 (예 : 가상화 된) 플랫폼에서는 OS에 엔트로피가 부족할 수 있습니다. 이 문제를 해결하기위한 "도저 지 해킹"이 있지만 엔트로피의 품질이 저하됩니다.
Stephen C

이것은 학문적 관심사가 아닙니다. 나는 (본 되지 않은! 사람이 있음) 주장 않았다 무작위 기반의 UUID를 고유없는 문제로 실행합니다.
Stephen C

32

원하는 UUID 종류에 따라 다릅니다 .

  • 표준 Java UUID클래스는 버전 4 (임의) UUID를 생성 합니다. ( 업데이트 - 버전 3 (이름) UUID도 생성 할 수 있습니다.) 다른 변형도 생성 할 수는 없지만 처리 할 수 ​​있습니다. (이 경우, "핸들"수단 구성체 UUID로부터 인스턴스 long, byte[]또는 String표현, 그리고 어떤 적절한 접근을 제공한다.)

  • 자바 UUID 생성기 (주전자) '에 의해 정의 된 UUID의 3'공식 '유형을 구현 취지는 지원 -4122 RFC 은 RFC 실제로 4 가지 유형을 정의하고 5 유형을 언급하지만 ... ".

UUID 유형 및 변형에 대한 자세한 내용은 Wikipedia에 요약되어 있으며 세부 사항은 RFC 4122 및 기타 사양에 있습니다.


1
완전히 사실은 아니지만, 다음을 사용하여 이름 기반 (버전 3) UUID를 생성 할 수도 있습니다.UUID.nameUUIDFromBytes(byte[] name)
DennisK

나는 정정되었다. " 지정된 바이트 배열을 기반으로 유형 3 (이름 기반) UUID 를 검색 하는 정적 팩토리"라는
Stephen C

게시물이 정확하다고 생각하지 않습니다. UUID 자바 문서는 생성자가 제 2 형 변형, 임의하지를 생성 상태. 유형 3의 경우을 사용하십시오 public static UUID nameUUIDFromBytes(byte[] name). 유형 4의 경우 public static UUID randomUUID(). JDK 클래스에는 유형 1을 사용할 수 없습니다.
slartibartfast

아뇨. 제 생각에는 꽤 옳았습니다. javadocs 상태 : "생성자는 UUID의 변형을 생성 할 수 있지만 (아래 설명 참조)" 4 개 변형, 실제로 유형 1 등을위한 자바 독을 읽고 다음과 같습니다clockSequence()
스티븐 C

27

Mark Byers의 답변을 예제로 확장하면됩니다.

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

다른 답변, 특히 올바른 이것 에 의해 스티븐 C .

Java 외부에 도달

Java 내 에서 UUID 값을 생성하는 것은 보안 문제로 인해 버전 4 (임의)로 제한됩니다 .

다른 버전의 UUID를 원하는 경우 다음 중 하나 를 호출 하여 Java 앱이 JVM 외부에 도달 하여 UUID를 생성하도록 할 수 있습니다.

  • 명령 줄 유틸리티
    거의 모든 운영 체제에 번들로 제공됩니다.
    예를 들어 uuidgenMac OS X, BSD 및 Linux에 있습니다.
  • 데이터베이스 서버 JDBC
    사용 하여 데이터베이스 서버에서 생성 된 UUID를 검색 하십시오 . 예를 들어, 확장 프로그램은 종종 Postgres 와 번들로 제공됩니다 . 이 확장은 버전 1, 3 및 4 값과 몇 가지 변형을 생성 할 수 있습니다.
    uuid-ossp
    • uuid_generate_v1mc() – 버전 1 UUID를 생성하지만 컴퓨터의 실제 MAC 주소 대신 임의의 멀티 캐스트 MAC 주소를 사용합니다.
    • uuid_generate_v5(namespace uuid, name text) – SHA-1이 해싱 방법으로 사용되는 것을 제외하고 버전 3 UUID와 같은 버전 5 UUID를 생성합니다.
  • 웹 서비스
    예를 들어 UUID Generator는 버전 1 및 3과 nil 값GUID를 작성 합니다.

3
귀하의 답변에 몇 가지 문제가 있습니다. 첫째, 표준 Java 라이브러리에서만 V4를 얻을 수 있다는 것은 이미 잘못된 것으로 나타났습니다 (V3도 가능합니다). 두 번째로, 표준 라이브러리 외에 Java 내에 옵션이없는 것처럼 들리면서 "보안 문제 때문에"손으로 소리를냅니다. 마지막으로 Java 내에서 할 수있는 방법이 많을 때 외부 소스에 따라 시작하는 것은 일반적으로 비효율적입니다 (프로그래밍 및 / 또는 성능 측면에서). SQL 서버에 기록).
DennisK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.