Javascript를 통한 UUID 생성(v4)

22186 단어 JavaScripttech
UUID에는 RFC 4122에 정의된 버전 4가 간단한 임의 수로 생성된 구조인 여러 가지 변종과 버전이 있습니다.
직접 하는 것도 간단하니까 실제로 자바스크립트로도 써봤어요.

실제로 해 보다


그 1
class UUID {

  static #uuidIte = ( function* () {

    const HEXOCTETS = Object.freeze( [ ...Array( 0x100 ) ].map( ( e, i ) => i.toString( 0x10 ).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;

  }

}

console.log( UUID.randomUUID() ); //e.g. 16E3908E-96DF-468E-B148-90A11814615F
겸사겸사 말씀드리겠습니다.js에 삽입되었을 때crypto가 존재하지 않기 때문에 Math.random()로 설치할 수 있습니다.
둘째 (crypto 미사용)
class UUID {

  static #uuidIte = ( function* () {

    const HEXOCTETS = Object.freeze( [ ...Array( 0x100 ) ].map( ( e, i ) => i.toString( 0x10 ).padStart( 2, "0" ).toUpperCase() ) );
    const VARSION = 0x40;
    const VARIANT = 0x80;
    const bytes = new Uint8Array( 16 );
    const rand = new Uint32Array( bytes.buffer );

    for (;;) {

      for ( let i = 0; i < rand.length; i++ ) {
        rand[ i ] = Math.random() * 0x100000000 >>> 0;
      }

      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;

  }

}

console.log( UUID.randomUUID() ); //e.g. 16E3908E-96DF-468E-B148-90A11814615F
이상!
분산형이 고속으로 생성될 수 있는 유일한 값으로 사용되는 것은 불가사의하다.

좋은 웹페이지 즐겨찾기