UUID 버전 4 생성

17247 단어 UUIDcryptoJavaScript
UUID에는 RFC 4122에 정의된 버전 4(이하 v4)가 간단한 임의 수로 생성되는 매우 간단한 메커니즘으로 여러 가지 변종 또는 버전이 있습니다.
그렇게 간단하기 때문에 스스로 쓰기도 쉽다.
실제로 자바스크립트로도 써봤어요.
UID 생성 코드 설치 예 1
class UUID {

  static #uuidIte = ( function* () {

    const HEXOCTETS = Object.freeze( [ ...Array(256) ].map( ( e, i ) => i.toString( 16 ).padStart( 2, "0" ).toUpperCase() ) );
    const VARSION = 0x40;
    const VARIANT = 0x80;

    for (;;) {

      const bytes = crypto.getRandomValues( new Uint8Array( 16 ) );
      yield "" +
        HEXOCTETS[ bytes[ 0 ] ] +
        HEXOCTETS[ bytes[ 1 ] ] +
        HEXOCTETS[ bytes[ 2 ] ] +
        HEXOCTETS[ bytes[ 3 ] ] + "-" +
        HEXOCTETS[ bytes[ 4 ] ] +
        HEXOCTETS[ bytes[ 5 ] ] + "-" +
        HEXOCTETS[ bytes[ 6 ] & 0x0f | VARSION ] +
        HEXOCTETS[ bytes[ 7 ] ] + "-" +
        HEXOCTETS[ bytes[ 8 ] & 0x3f | VARIANT ] +
        HEXOCTETS[ bytes[ 9 ] ] + "-" +
        HEXOCTETS[ bytes[ 10 ] ] +
        HEXOCTETS[ bytes[ 11 ] ] +
        HEXOCTETS[ bytes[ 12 ] ] +
        HEXOCTETS[ bytes[ 13 ] ] +
        HEXOCTETS[ bytes[ 14 ] ] +
        HEXOCTETS[ bytes[ 15 ] ];

    }

  } )();

  static randomUUID() {

    return this.#uuidIte.next().value;

  }

}

consle.log( UUID.randomUUID() ); //xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
무작위 수Math.random도 얻을 수 있지만 암호의 강도에 있어서crypto.getRandomValues는 더욱 안전하다.
또 바이트열이어서 표현도 간결해졌다.
그러나 의외로 사용crypto.getRandomValues된 글은 다음과 같은 내용만 찾았다.
JavaScript의 1행 세그먼트 서브셋
아마 비밀번호 강도보다'충돌 위험이 없는 아이디를 단순히 만들고 싶다'는 말이 대다수일 것이기 때문에 사용Math.random해도 위험성이 적겠죠.
다음은 사용Math.random의 실시례도 설명한다.
UID 생성 코드 설치 예제 2
class UUID {

  static #uuidIte = ( function* () {

    const HEXOCTETS = Object.freeze( [ ...Array(256) ].map( ( e, i ) => i.toString( 16 ).padStart( 2, "0" ).toUpperCase() ) );
    const VARSION = 0x40;
    const VARIANT = 0x80;

    for (;;) {

      const uint32 = new Uint32Array( 4 ).fill( Math.random() * 0x100000000 >>> 0 );
      yield "" +
        HEXOCTETS[ uint32[ 0 ] & 0xff ] +
        HEXOCTETS[ uint32[ 0 ] >>> 8 & 0xff ] +
        HEXOCTETS[ uint32[ 0 ] >>> 16 & 0xff ] +
        HEXOCTETS[ uint32[ 0 ] >>> 24 & 0xff ] + "-" +
        HEXOCTETS[ uint32[ 1 ] & 0xff ] +
        HEXOCTETS[ uint32[ 1 ] >>> 8 & 0xff ] + "-" +
        HEXOCTETS[ uint32[ 1 ] >>> 16 & 0x0f | VARSION ] +
        HEXOCTETS[ uint32[ 1 ] >>> 24 & 0xff ] + "-" +
        HEXOCTETS[ uint32[ 2 ] & 0x3f | VARIANT ] +
        HEXOCTETS[ uint32[ 2 ] >>> 8 & 0xff ] + "-" +
        HEXOCTETS[ uint32[ 2 ] >>> 16 & 0xff ] +
        HEXOCTETS[ uint32[ 2 ] >>> 24 & 0xff ] +
        HEXOCTETS[ uint32[ 3 ] & 0xff ] +
        HEXOCTETS[ uint32[ 3 ] >>> 8 & 0xff ] +
        HEXOCTETS[ uint32[ 3 ] >>> 16 & 0xff ] +
        HEXOCTETS[ uint32[ 3 ] >>> 24 & 0xff ];

    }

  } )();

  static randomUUID() {

    return this.#uuidIte.next().value;

  }

}
실행 속도를 비교하면 사용crypto.getRandomValuesMath.random보다 훨씬 빠르다.


실행 환경에 따라 달라질 수 있지만 방법을 고려하면 어느 환경이든 대체로 같은 결과가 나올 수 있을 것이다.

좋은 웹페이지 즐겨찾기