[iOS, Swift] UUID는 어떤 원리로 만들어지는 것일까..

Clint Jang
7 min readDec 31, 2019

--

갑자기! 문득! 그냥! 별생각 없이!!!

애플, iOS의 UUID가 어떤 원리로 만들어지는 것일까?

생성 알고리즘에 대해 고민이 들어서 검색해 봤어요.

검색해보기 전에 저는…

시간정보가 포함되어 아주아주 똑같은 값이 만들어지기 힘든 유일한 키값이라고 생각했어요.

아래는 잠깐 검색해 본 내용을 저도 기억하기 좋게.. 조금 길게 메모해 봤습니다.

UUID 란?

UUIDUniversally Unique IDentifier의 약어이고 범용 고유 식별자 라고 할 수 있네요.

UUID 표준에 따라 이름을 부여하면 고유성을 완벽하게 보장할 수는 없지만 실제 사용 상에서 중복될 가능성이 거의 없다고 인정되기 때문에 많이 사용 되고 있다고 하네요.

UUID 포멧은?

총 36개 문자(32개 문자와 4개의 하이픈)로 되어 있네요.

8–4–4–4–12라는 5개의 그룹을 ‘-’ (하이픈) 으로 구분하고 있네요.

예로 들어보면 아래의 형태가 되는 것이 군요.

  • 12345678–1234–1234–1234–1234567890ab
  • 550e8400-e29b-41d4-a716–446655440000

340,282,366,920,938,463,463,374,607,431,768,211,456개의 사용 가능한 UUID 값이 있다고 합니다…

10의 몇승이냐…

으매 10의 38승이네요.

10의 4승은 만, 8승은 억, 12승은 조, 16승은 경, 20승은 해, 24승은 자, 28승은 양, 32승은 구, ⭐ 36승은 간 ⭐, 40승은 정이니..

340의 경우의 수 이군요.

단순하게 랜덤하게 생성해도 똑같아지기가 참 힘든 경우의 수일 것 같습니다.

UUID는 누가 만들었을까?

이런한 UUID는 Open Software Foundation (OSF)에서 제정한 표준이군요.

RFC 4122

UUID는 어떤 표준에 만들어지는 지 검색해 보니.. RFC 4122 문서를 기반으로 생성하더군요.

아.. 참고로

RFC는 Request for Comments의 약어이군요.

아래는 위키의 내용인 데.. 기억하려고 적어보았습니다.

  • 비평을 기다리는 문서라는 의미로, 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등을 아우르는 메모를 나타낸다고 합니다.
  • RFC 편집자는 매 RFC 문서에 일련 번호를 부여한다고 하네요.
  • 일단 일련 번호를 부여 받고 출판되면, RFC는 절대 폐지되거나 수정되지 않는 다고 합니다.
  • 만약 어떤 RFC 문서가 수정이 필요하다면, 저자는 수정된 문서를 다른 RFC 문서로 다시 출판해야 한다고 합니다. 그러므로, 일부 RFC는 이전 버전의 RFC를 개선한 문서이며, 이전 버전의 RFC를 무효화하기도 한다고 합니다…
    이러한 덮어쓰는 방식을 통해, 번호 순으로 나열된 일련의 RFC는 인터넷 표준의 역사를 나타내기도 한다고 합니다.

그렇다면!!

우리 애플의 UUID 도 RFC 4122의 표준으로 만들어 지고 있을까?

iOS의 UUID 생성은?

  • UUID()으로 보통 사용하시죠? String 값이 필요하면
  • UUID().uuidString 하면 되겠네요.

그렇다면 UUID apple 문서를 보면 정보가 있을 것 같습니다.

  • Initializes a new UUID with RFC 4122 version 4 random bytes.
  • RFC 4122 의 버전 4 의 방식으로 생성하고 있다고 하네요.
  • 그리고 방식이???? random bytes 라고 하고요.

아하!! iOS UUID는 RFC 4122 의 4 버전의 방식으로 생성하는 것을 우리는 사용하고 있군요.

4버전이 무엇일까???? 하면서…

RFC 4122는 문서에서 4.1.3. Version 을 확인해봤습니다.

여기를 보니

아하!! UUID 를 만드는 방식은 여러가지가 있는 것을 알았습니다.

추가적으로 인터넷 검색해보니 보통 Version 1, 3, 4, 5 방식을 사용하나봐요.

  • 버전 1 : 시간 정보를 기반으로 UUID 를 만드는 방식인 것 같습니다.
  • 버전 3: MD5 hashing을 사용해서 생성하는 방법이네요.
  • 버전 4: 랜덤 값을 이용해서 UUID를 생성하는 방법입니다.
  • 버전 5: SHA-1 hashing 을 사용해서 생성하는 방법이네요.

애플은 기본적으로 생성하면 RFC 4122 버전 4의 무작위UUID 생성 방법을 사용합니다.

어쩌면 같은 값이 나올지도 모르겠네요. 가능성은 너무 낮을 것 같습니다.

대신 다른 방식에 비해 랜덤하게 만들어 낸 값이니 역으로 추론할 데이터는 없는 것 같습니다.

예를 들어 버전 1의 방식으로 Mac address 기반으로 시간 정보 기반으로 생성했다면 생성된 UUID 를 가지고 시간 정보와 Mac address 를 누군가 추론해낼 수 있지 않을까요?

그래서 이렇게 버전 4의 방법을 사용한 것인가..????

(혼자 막이래 ㅋㅋ)

물론 저도 깊게 보지는 않았지만, 애플에서 다른 형태의 init/생성이나 사용법이 있을 지도 모릅니다.

단지, 제가 보통 사용하는 UUID의 기본 init()에 대해서만 생각해보고 내용을 작성했습니다.

그러면서 겸사 겸사 검색해보고 메모해봤습니다.

(잘못된 내용이 있으면 수정하겠습니다.)

오늘도 즐거운 하루되세요. 🙇‍

그리고 오늘이 12월 31일 이군요.. 한해 마무리 잘 되시고 새해 복 많이 받으시길 기원합니다~~~~ 🙇‍🙇‍🙇‍🙇‍🙇‍

--

--