자바 스크립트 시간으로 고유 번호 만들기


96

자바 스크립트를 사용하여 즉시 고유 한 ID 번호를 생성해야합니다. 과거에는 시간을 사용하여 숫자를 생성하여이 작업을 수행했습니다. 숫자는 4 자리 연도, 2 자리 월, 2 자리 일, 2 자리시, 2 자리 분, 2 자리 초 및 3 자리 밀리 초로 구성됩니다. 따라서 다음과 같이 보일 것입니다. 20111104103912732 ... 이것은 내 목적에 맞는 고유 번호에 대한 충분한 확실성을 제공합니다.

이 일을 한 지 오래되었고 더 이상 코드가 없습니다. 누구든지이 작업을 수행 할 수있는 코드가 있거나 고유 ID 생성에 대한 더 나은 제안이 있습니까?



고려해 보셨습니까 new Date().toISOString ()?
gaspard

답변:


67

고유 한 번호를 원하면

var timestamp = new Date().getUTCMilliseconds();

간단한 숫자를 얻을 수 있습니다. 그러나 읽을 수있는 버전이 필요한 경우 약간의 처리가 필요합니다.

var now = new Date();

timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getMonth < 9 ? '0' : '') + now.getMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += ((now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()

3
@ Áxel : 나는 그것이 독특하다고 말하지 않았고 "독특하다"고 말했다. 물론 클라이언트 측에서 생성 된 타임 스탬프를 사용하면 복제가 생성됩니다.
Marc B

79
타임 스탬프는 new Date().getTime();date.getUTCMilliseconds() 반환 0에서 999 사이의 숫자.date.getTime() 1월 1일 1970 년 (정상 타임 스탬프) 이후 반환 밀리 초. w3schools.com/jsref/jsref_obj_date.asp
Automatico

8
-1, 질문이 고유 번호 입니다. 첫 번째 코드 블록은 완전히 생략해야합니다.
Andrey

이것은 2 개의 고유 한 값을 생성 할 수 있습니다.function foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
Sharikov Vladislav 2015

10
getUTCMilliseconds The value returned by getUTCMilliseconds() is an integer between 0 and 999. . 이것은 고유 ID에 대한 최악의 아이디어입니다. 첫 번째 단락을 제거해야합니다.
gaspard

118

더 나은 접근 방식은 다음과 같습니다.

new Date().valueOf();

대신에

new Date().getUTCMilliseconds();

valueOf () 는 "가장 가능성이 높은"고유 번호입니다. http://www.w3schools.com/jsref/jsref_valueof_date.asp .


19
고유 한 숫자가 아닙니다. 밀리 초는 고유 ​​한 것으로 간주 될만큼 세분화되어 있지 않습니다.
Vamsi 모한 자 얀티

3
또는 단순히+new Date()
thdoan

1
방금 for 루프를 실행했는데 valueOf(). - 난 그냥이 사용 +performance.now().toString().replace('.', 7) developer.mozilla.org/en-US/docs/Web/API/Performance/now
Itzik 벤 Hutta

1
@ItzikBenHutta 같은 값의 3 배를 얻었습니다. 멀티 코어 CPU 사용, 아마도 스레드와의 경쟁 조건.
that-ben

70

생각할 수있는 한 많은 개별 인스턴스 중에서 고유 할 수있는 번호를 만드는 가장 짧은 방법은 다음과 같습니다.

Date.now() + Math.random()

함수 호출에 1 밀리 초 차이가있는 경우 다른 숫자를 생성하는 것이 100 % 보장됩니다. . 동일한 밀리 초 내의 함수 호출의 경우이 동일한 밀리 초 내에 수백만 개 이상의 숫자를 생성하는 경우에만 걱정하기 시작해야합니다. 이는 그다지 가능성이 없습니다.

동일한 밀리 초 내에 반복되는 숫자를 얻을 확률에 대한 자세한 내용은 https://stackoverflow.com/a/28220928/4617597을 참조 하십시오.


7
또한 난수의 모든 비트를 유지하려면 별도로 생성하고 문자열로 병합 할 수 있습니다. new Date (). valueOf (). toString (36) + Math.random (). toString (36) .substr (2) 적절한 양의 엔트로피 인 19 자의 영숫자 문자열을 제공합니다. 그것의 절반은 예측 가능하지만.
Erik Pukinskis

2
다른 더 높은 투표 응답을 시도 할 때 비동기 함수에서 호출 할 때 동일한 값을 2 배, 심지어 3 배까지 얻었 기 때문에 이것은 허용되는 대답이어야합니다. 이것은 표준 8 코어 CPU가 정확히 동시에 8 개의 고유 한 문자열을 생성하기에 충분한 임의성을 제공하는 것으로 보입니다.
그 벤

22

다음 코드를 사용하여 간단히 수행 할 수 있습니다.

var date = new Date();
var components = [
    date.getYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds()
];

var id = components.join("");

6
동일한 밀리 초에 두 번 호출되면 어떻게 될까요?
TBE

1
실제로,하지만 op에 대해서는 괜찮 았습니다. "이것은 내 목적에 맞는 고유 번호에 대한 충분한 확실성을 제공 할 것입니다."
August Lilleaas

17

여러 숫자보다 작은 것을 원할 때 내가하는 일은 다음과 같습니다.

var uid = (new Date().getTime()).toString(36)

1
@blushrt true, 드물게 충돌이 발생할 수 있습니다. code.google.com/p/crypto-js 와 같은 것을 사용하여 타임 스탬프를 md5 할 수 있지만 제 목적을 위해 "충분히 고유"하고 더 중요한 것은 더 빠릅니다.
frumbert 2015

@frumbert, 상황에 따라 다릅니다. MD5는 충돌에 강하지 않습니다. 그러나 귀하의 경우에는 숫자 값을 ASCII 표현으로 변환한다고 가정하는 toString (36) 때문에 매우 빠르게 문제가 발생했지만 확실하지는 않지만 uuid 생성기를 자주 호출하면 문제를 볼 수 있습니다. 문자가 변경되어 충돌 할 가능성이 높습니다. 새로운 Date.getTime () 호출을 고수하면 훨씬 더 나은 확률을 얻을 수 있습니다. 그러나 헤이 그것이 귀하의 목적으로 작동했다면 문제 없습니다. 클라이언트 측 코드에만 고유 ID가 필요했으며 결국 uuid node lib를 사용했습니다.
blushrt 2015

이것을 사랑해! (Date.now() + Math.random()).toString(36)밀리 초 충돌을 방지하기 위해 조정했습니다 . 짧고 "k92g5pux.i36"과 같은 것을 생성합니다
Edward

16

이것은 Date인스턴스를 만드는 것보다 더 빠르게 수행되고, 더 적은 코드를 사용하며, 항상 (로컬에서) 고유 번호를 생성합니다.

function uniqueNumber() {
    var date = Date.now();

    // If created at same millisecond as previous
    if (date <= uniqueNumber.previous) {
        date = ++uniqueNumber.previous;
    } else {
        uniqueNumber.previous = date;
    }

    return date;
}

uniqueNumber.previous = 0;

jsfiddle : http://jsfiddle.net/j8aLocan/

나는 Bower와 npm에서 이것을 공개했습니다 : https://github.com/stevenvachon/unique-number

cuid , puid 또는 shortid 와 같은 좀 더 정교한 것을 사용 하여 숫자가 아닌 것을 생성 할 수도 있습니다 .


1
난수를 추가하면 실제로는 완전한 증거가 줄어드는 것 같습니다. 타임 스탬프 만 있으면 똑같은 밀리 초에 두 개의 숫자가 동일하게 생성되어야합니다. 두 개의 난수를 추가하여 이제 수학으로 인해 곱할 때 동일한 결과를 얻을 수있는 많은 숫자 조합을 만들었습니다. 그럴 것 같지는 않지만 ... 그렇지 않습니까?
Phil

네. 아마도 내 대답과 이발사의 대답의 조합이 가장 좋을 것입니다.
Steven Vachon

내 대답을 업데이트했습니다. 생각해 주셔서 감사합니다.
Steven Vachon

2
당신의 대답을 고르지 않으려 고 노력하고 있습니다.하지만이 새로운 솔루션은 실제로 "동일한 밀리 초에 생성 된 둘 이상의 ID"문제를 해결하지 않습니다. 왜냐하면 클라이언트 측에서는 자바 스크립트이기 때문입니다. 다른 사용자가 정확히 동일한 밀리 초에 숫자를 생성 한 경우 '다른'사용자의 uniqueNumber.previous에 반영되지 않습니다. 서버의 어딘가에에 저장하고 고유성을 확인하지 않는 ... 이런 순수 JS 기반의 솔루션이 될 수 있음을 단지 방법이 없습니다 특정 이 고유 번호를 만드는 것입니다.
Phil

글쎄, 그것은 단지 고유 번호보다 더 정교한 시스템이 될 것입니다.
Steven Vachon 2015 년

12

나는 사용한다

Math.floor(new Date().valueOf() * Math.random())

따라서 혹시라도 코드가 동시에 실행되면 난수가 동일 할 가능성이 아주 작습니다.


new Date()어려운 것은 유용 하지 않습니다 . 두 개의 다른 날짜로 같은 숫자를 얻을 수 있습니다
JMaylin 2016

1
단순히하는 것보다 더 나은 방법은 Math.random()무엇입니까?
JMaylin 2016

7

이렇게해야합니다.

var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970

1
많은 경우에 유용하지만,이 함수가 동일한 밀리 초에 여러 번 호출되는 경우 순수한 "고유 한"ID를 생성하지는 않지만 ... 어쨌든 사용자와 UI 상호 작용에는 좋습니다.
Benjamin Piette 2015

1
이것은 받아 들여진 대답이어야합니다. 어렵고 불필요한 관련성이없는 쓰레기가 많으며이 답변은 밀리 초당 고유 한 시간을 제공합니다.
유전자 b.

5

몇 밀리 초 후에 고유 번호 Date.now()를 원하면을 사용하고 내부에서 for loop사용하려면 Date.now() and Math.random()함께 사용하십시오.

for 루프 내의 고유 번호

function getUniqueID(){
    for(var i = 0; i< 5; i++)
      console.log(Date.now() + ( (Math.random()*100000).toFixed()))
}
getUniqueID()

출력 :: 모든 숫자는 고유합니다.

15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316

없는 고유 번호 Math.random()

function getUniqueID(){
        for(var i = 0; i< 5; i++)
          console.log(Date.now())
    }
    getUniqueID()

출력 :: 숫자가 반복됩니다.

1559825328327 1559825328327 1559825328327 1559825328328 1559825328328


4

온라인 조사에서 세션 당 고유 한 ID를 생성하는 다음 개체를 생각해 냈습니다.

        window.mwUnique ={
        prevTimeId : 0,
        prevUniqueId : 0,
        getUniqueID : function(){
            try {
                var d=new Date();
                var newUniqueId = d.getTime();
                if (newUniqueId == mwUnique.prevTimeId)
                    mwUnique.prevUniqueId = mwUnique.prevUniqueId + 1;
                else {
                    mwUnique.prevTimeId = newUniqueId;
                    mwUnique.prevUniqueId = 0;
                }
                newUniqueId = newUniqueId + '' + mwUnique.prevUniqueId;
                return newUniqueId;                     
            }
            catch(e) {
                mwTool.logError('mwUnique.getUniqueID error:' + e.message + '.');
            }
        }            
    }

어떤 사람들에게는 도움이 될 수 있습니다.

건배

앤드류


이것은이 질문에 대해 현재까지 가장 간단하고 오류가없는 솔루션입니다. 다른 솔루션을 시도했지만 (아래 참조) 추가 개발이 필요한 몇 가지 문제가 있습니다.
loretoparisi

3

또한 다음을 수행해야합니다.

(function() {
    var uniquePrevious = 0;
    uniqueId = function() {
        return uniquePrevious++;
    };
}());

lodash UniqueId 함수에서 찾을 수있는 매우 유사한 구현입니다. 저에게는 솔루션이 간단하고 깨끗합니다.
Kamil Naja

3

ES6에서 :

const ID_LENGTH = 36
const START_LETTERS_ASCII = 97 // Use 64 for uppercase
const ALPHABET_LENGTH = 26

const uniqueID = () => [...new Array(ID_LENGTH)]
  .map(() => String.fromCharCode(START_LETTERS_ASCII + Math.random() * ALPHABET_LENGTH))
 .join('')

예:

 > uniqueID()
 > "bxppcnanpuxzpyewttifptbklkurvvetigra"

2

JS에서 항상 고유 ID를 얻습니다.

function getUniqueId(){
   return (new Date().getTime()).toString(36) + new Date().getUTCMilliseconds();
}

getUniqueId()    // Call the function

------------results like

//"ka2high4264"

//"ka2hj115905"

//"ka2hj1my690"

//"ka2hj23j287"

//"ka2hj2jp869"

2

2020 년에는 브라우저 내 Crypto API 를 사용하여 강력한 암호화 난수 값을 생성 할 수 있습니다 .

function getRandomNumbers() {
  const typedArray = new Uint8Array(10);
  const randomValues = window.crypto.getRandomValues(typedArray);
  return randomValues.join('');
}

console.log(getRandomNumbers());
// 1857488137147725264738

모두 Uint8ArrayCrypto.getRandomValues는 IE11을 포함한 모든 주요 브라우저에서 지원됩니다


1

내 자신의 향후 참조를 위해 여기에이 코드 스 니펫을 게시합니다 (보장되지는 않지만 충분히 "고유 한"것으로 충분 함).

// a valid floating number
window.generateUniqueNumber = function() {
    return new Date().valueOf() + Math.random();
};

// a valid HTML id
window.generateUniqueId = function() {
    return "_" + new Date().valueOf() + Math.random().toFixed(16).substring(2);
};

1

이렇게하면 거의 보장 된 고유 한 32 자 키 클라이언트 쪽이 생성됩니다. 숫자 만 원하는 경우 "chars"var를 변경합니다.

var d = new Date().valueOf();
var n = d.toString();
var result = '';
var length = 32;
var p = 0;
var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

for (var i = length; i > 0; --i){
    result += ((i & 1) && n.charAt(p) ? '<b>' + n.charAt(p) + '</b>' : chars[Math.floor(Math.random() * chars.length)]);
    if(i & 1) p++;
};

https://jsfiddle.net/j0evrdf1/1/


1

이것을 사용하십시오 : 자바 스크립트에서 고유 번호를 만들려면

var uniqueNumber=(new Date().getTime()).toString(36);

실제로 작동한다. :)


1
    function UniqueValue(d){
        var dat_e = new Date();
        var uniqu_e = ((Math.random() *1000) +"").slice(-4)

        dat_e = dat_e.toISOString().replace(/[^0-9]/g, "").replace(dat_e.getFullYear(),uniqu_e);
        if(d==dat_e)
            dat_e = UniqueValue(dat_e);
        return dat_e;
    }

호출 1 : UniqueValue ( '0')
호출 2 : UniqueValue (UniqueValue ( '0')) // 복잡합니다.

샘플 출력 :
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113804
03730116113248680116113804 03730116113248804804804


1

밀리 초는 노드에서 밀리 초마다 업데이트되지 않으므로 다음은 대답입니다. 이렇게하면 사람이 읽을 수있는 고유 한 티켓 번호가 생성됩니다. 저는 프로그래밍과 nodejs를 처음 사용합니다. 내가 틀렸다면 나를 바로 잡으십시오.

function get2Digit(value) {
if (value.length == 1) return "0" + "" + value;
else return value;

}

function get3Digit(value) {
if (value.length == 1) return "00" + "" + value;
else return value;

}

function generateID() {
    var d = new Date();
    var year = d.getFullYear();
    var month = get2Digit(d.getMonth() + 1);
    var date = get2Digit(d.getDate());
    var hours = get2Digit(d.getHours());
    var minutes = get2Digit(d.getMinutes());
    var seconds = get2Digit(d.getSeconds());
    var millSeconds = get2Digit(d.getMilliseconds());
    var dateValue = year + "" + month + "" + date;
    var uniqueID = hours + "" + minutes + "" + seconds + "" + millSeconds;

    if (lastUniqueID == "false" || lastUniqueID < uniqueID) lastUniqueID = uniqueID;
    else lastUniqueID = Number(lastUniqueID) + 1;
    return dateValue + "" + lastUniqueID;
}

0

@abarber가 제안한 솔루션 (new Date()).getTime()이 밀리 초의 창 tick을 사용하고이 간격에서 충돌이 발생 하는 경우 a 를 합산 하기 때문에 좋은 솔루션이라고 가정하면 여기에서 명확하게 볼 수 있듯이 내장형을 사용할 수 있습니다.

다음을 사용하여 1/1000 창 프레임에서 충돌이 발생할 수있는 방법을 여기서 확인할 수 있습니다 (new Date()).getTime().

console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1155:1 1469615396590
VM1155:1 1469615396591
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1156:1 1469615398845
VM1156:1 1469615398846
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1158:1 1469615403045
VM1158:1 1469615403045

두 번째로 1/1000 창에서 충돌을 방지하는 제안 된 솔루션을 시도합니다.

console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() ); 
VM1159:1 14696154132130
VM1159:1 14696154132131

process.nextTick, 이벤트 루프에서 호출 되는 노드와 같은 함수를 단일 로 사용하는 것을 고려할 수 있으며 여기에tick 잘 설명되어 있습니다 . 물론 브라우저에는 없어서 process.nextTick어떻게해야하는지 알아 내야합니다. 구현이 설치할 nextTick수있는 브라우저에서 I / O에 가장 가까운 기능을 사용하여 브라우저의 기능을 setTimeout(fnc,0), setImmediate(fnc), window.requestAnimationFrame. 여기에서 제안한대로를 추가 할 수 있지만는 window.postMessage필요하므로 독자에게 남겨 둡니다 addEventListener. 여기에서 더 간단하게 유지하기 위해 원래 모듈 버전을 수정했습니다.

getUniqueID = (c => {
 if(typeof(nextTick)=='undefined')
nextTick = (function(window, prefixes, i, p, fnc) {
    while (!fnc && i < prefixes.length) {
        fnc = window[prefixes[i++] + 'equestAnimationFrame'];
    }
    return (fnc && fnc.bind(window)) || window.setImmediate || function(fnc) {window.setTimeout(fnc, 0);};
})(window, 'r webkitR mozR msR oR'.split(' '), 0);
 nextTick(() => {
   return c( (new Date()).getTime() )  
 })
})

따라서 우리는 1/1000 창에 있습니다.

getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966

0

getTime () 또는 valueOf ()를 사용하는 것이 더 좋을 수도 있지만 이렇게하면 고유하고 사람이 이해할 수있는 숫자 (날짜와 시간을 나타냄)를 반환합니다.

window.getUniqNr = function() {
  var now = new Date(); 
  if (typeof window.uniqCounter === 'undefined') window.uniqCounter = 0; 
  window.uniqCounter++; 
  var m = now.getMonth(); var d = now.getDay(); 
  var h = now.getHours(); var i = now.getMinutes(); 
  var s = now.getSeconds(); var ms = now.getMilliseconds();
  timestamp = now.getFullYear().toString() 
  + (m <= 9 ? '0' : '') + m.toString()
  +( d <= 9 ? '0' : '') + d.toString() 
  + (h <= 9 ? '0' : '') + h.toString() 
  + (i <= 9 ? '0' : '') + i.toString() 
  + (s <= 9 ? '0' : '') + s.toString() 
  + (ms <= 9 ? '00' : (ms <= 99 ? '0' : '')) + ms.toString() 
  + window.uniqCounter; 

  return timestamp;
};
window.getUniqNr();

0
let now = new Date();
let timestamp = now.getFullYear().toString();
let month = now.getMonth() + 1;
timestamp += (month < 10 ? '0' : '') + month.toString();
timestamp += (now.getDate() < 10 ? '0' : '') + now.getDate().toString();
timestamp += (now.getHours() < 10 ? '0' : '') + now.getHours().toString();
timestamp += (now.getMinutes() < 10 ? '0' : '') + now.getMinutes().toString();
timestamp += (now.getSeconds() < 10 ? '0' : '') + now.getSeconds().toString();
timestamp += (now.getMilliseconds() < 100 ? '0' : '') + now.getMilliseconds().toString();

0

쉽고 항상 고유 한 가치를 얻으십시오.

const uniqueValue = (new Date()).getTime() + Math.trunc(365 * Math.random());
**OUTPUT LIKE THIS** : 1556782842762

0

나는 이렇게했다

function uniqeId() {
   var ranDom = Math.floor(new Date().valueOf() * Math.random())
   return _.uniqueId(ranDom);
}

0
function getUniqueNumber() {

    function shuffle(str) {
        var a = str.split("");
        var n = a.length;
        for(var i = n - 1; i > 0; i--) {
            var j = Math.floor(Math.random() * (i + 1));
            var tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
        return a.join("");
    }
    var str = new Date().getTime() + (Math.random()*999 +1000).toFixed() //string
    return Number.parseInt(shuffle(str));   
}

0

위의 #Marcelo Lazaroni 솔루션과 관련하여

Date.now() + Math.random()

이 1567507511939.4558 (소수점 4 개로 제한됨)과 같은 숫자를 반환하고 0.1 %마다 고유하지 않은 숫자 (또는 충돌)를 제공합니다.

toString ()을 추가하면이 문제가 해결됩니다.

Date.now() + Math.random().toString()

'15675096840820.04510962122198503'(문자열)을 반환하고 '동일한'밀리 초를 얻지 못할 정도로 '느리다'.


0
let uuid = ((new Date().getTime()).toString(36))+'_'+(Date.now() + Math.random().toString()).split('.').join("_")

샘플 결과 "k3jobnvt_15750033412250_18299601769317408"


0

toString(36)약간 느린을 사용 하면 더 빠르고 독특한 솔루션이 있습니다.

new Date().getUTCMilliseconds().toString() +
"-" +
Date.now() +
"-" +
filename.replace(/\s+/g, "-").toLowerCase()

0

고유 번호를 얻으려면 :

function getUnique(){
    return new Date().getTime().toString() + window.crypto.getRandomValues(new Uint32Array(1))[0];
}
// or 
function getUniqueNumber(){
    const now = new Date();
    return Number([
        now.getFullYear(),
        now.getMonth(),
        now.getDate(),
        now.getHours(),
        now.getMinutes(),
        now.getUTCMilliseconds(),
        window.crypto.getRandomValues(new Uint8Array(1))[0]
    ].join(""));
}

예:

getUnique()
"15951973277543340653840"

for (let i=0; i<5; i++){
    console.log( getUnique() );
}
15951974746301197061197
15951974746301600673248
15951974746302690320798
15951974746313778184640
1595197474631922766030

getUniqueNumber()
20206201121832230

for (let i=0; i<5; i++){
    console.log( getUniqueNumber() );
}
2020620112149367
2020620112149336
20206201121493240
20206201121493150
20206201121494200

다음을 사용하여 길이를 변경할 수 있습니다.

new Uint8Array(1)[0]
// or
new Uint16Array(1)[0]
// or
new Uint32Array(1)[0]

질문 은 임의의 문자열이 아닌 고유 번호를 요청했습니다 .
tshimkus

0

내가 찾은 간단한 해결책

var today = new Date (). valueOf ();

console.log (오늘);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.