node.js로 고유 ID를 생성하는 방법


174
function generate(count) {
    var founded = false,
        _sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
        str = '';
    while(!founded) {
        for(var i = 0; i < count; i++) {
            str += _sym[parseInt(Math.random() * (_sym.length))];
        }
        base.getID(string, function(err, res) {
            if(!res.length) {
                founded = true; // How to do it?
            }
        });
    }
    return str;
}

데이터베이스 쿼리 콜백으로 변수 값을 설정하는 방법은 무엇입니까? 어떻게 할 수 있습니까?


@JamesAllardice, 데이터베이스 쿼리를 사용 하여이 작업을 수행하는 방법을 이해해야합니다. 죄송합니다
owl

1
이 질문은 중복으로 잘못 표시되었습니다. 링크 된 질문은 일반적인 자바 스크립트에서 어떻게하는지 대답합니다. 이 질문에서 가장 높은 등급의 답변은 node.js에만 해당됩니다.
Mike Post

5
나는 대답으로이 붙여 싶어요 : var hexstring = crypto.randomBytes(16).toString("hex");다음var guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
selbie

이것은 좋은 대답 new mongo.ObjectID();이며 수동으로 stackoverflow.com/a/56106999/4701635
Paresh Barad

답변:


18

node.js를 사용한 지 얼마되지 않았지만 도움이 될 것 같습니다.

첫째, 노드에는 단일 스레드 만 있으며 콜백을 사용해야합니다. 코드에서 일어날 일은 base.getID쿼리가 실행을 위해 큐에 대기하지만 while루프는 소중하게 바쁜 루프로 계속 실행됩니다.

다음과 같이 콜백으로 문제를 해결할 수 있어야합니다.

function generate(count, k) {
    var _sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
    var str = '';

    for(var i = 0; i < count; i++) {
        str += _sym[parseInt(Math.random() * (_sym.length))];
    }
    base.getID(str, function(err, res) {
        if(!res.length) {
          k(str)                   // use the continuation
        } else generate(count, k)  // otherwise, recurse on generate
    });
}

그런 식으로 사용하십시오

generate(10, function(uniqueId){
  // have a uniqueId
})

나는 약 2 년 동안 노드 / JS를 코딩하지 않았으며 이것을 테스트하지는 않았지만 기본 아이디어는 사용하지 않아야합니다. 바쁜 루프를 사용하지 말고 콜백을 사용하십시오. 노드 비동기 패키지를 살펴볼 수 있습니다.


4
Math.random은 특히 임의의 ID가 필요할 때, 특히 예측 불가능하고 / 암호 적으로 안전해야하는 경우에는 좋지 않은 선택입니다.
Jecho Jekov

326

NPM uuid 패키지 설치 (출처 : https://github.com/kelektiv/node-uuid ) :

npm install uuid

코드에서 사용하십시오.

var uuid = require('uuid');

그런 다음 ID를 만드십시오 ...

// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

** 업데이트 3.1.0
위의 사용법은 이상 사용 되지 않으므로 다음같이이 패키지를 사용하십시오.

const uuidv1 = require('uuid/v1');
uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

const uuidv4 = require('uuid/v4');
uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

** 업데이트 7.x
이제 위의 사용법도 이상 사용 되지 않으므로 다음같이이 패키지를 사용하십시오.

const { v1: uuidv1 } = require('uuid');
uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

const { v4: uuidv4 } = require('uuid');
uuidv4(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

감사하지만 데이터베이스 쿼리로해야합니다. :)
owl

@owl 나는 당신이 무슨 뜻인지 이해하지 못합니다. SQL에서?
Vinz243

51
DB 쿼리에 있다면 어떤 차이점이 있습니까? 고유 한 ID가 있으므로 이제 데이터베이스와 통신하는 데 사용하는 인터페이스에서 사용하십시오.
jraede

uuid 패키지와 node-uuid 패키지의 차이점은 무엇입니까?
ishandutta2007

5
@ ishandutta2007 node-uuid는 더 이상 사용되지 않습니다 : "DEPRECATED : uuid 패키지를 대신 사용하십시오."
diutsu

237

노드에서 임의의 32 문자 문자열을 만드는 가장 빠른 방법은 기본 crypto모듈 을 사용하는 것입니다 .

const crypto = require("crypto");

const id = crypto.randomBytes(16).toString("hex");

console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e

53
외부 의존성이 필요하지 않기 때문에이 솔루션을 좋아합니다. 또한 base64 버전도 유용하다는 것을 알았습니다. crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
hiroshi

5
무작위입니까, 아니면 독특합니까? 임의의 기능을 정교하게 작성하십시오.
Maximi

'암호 적으로 강력한 의사 난수 데이터를 생성합니다.' API
Stanislasdrg Reinstate Monica

1
cryptonpm을 설치하면이 경고가 표시됩니다.crypto@1.0.1: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in
AIon

1
이로 인해 사용 중지 경고가 발생합니다.
Razze

34

다른 접근법은 shortid를 사용하는 것입니다. npm 패키지를 입니다.

사용하기 매우 쉽습니다 :

var shortid = require('shortid');
console.log(shortid.generate()); // e.g. S1cudXAF

몇 가지 매력적인 기능이 있습니다.

ShortId는 놀라 울 정도로 짧은 비 순차 URL 친화적 인 고유 ID를 만듭니다. URL 단축기, MongoDB 및 Redis ID 및 기타 모든 ID 사용자에게 적합합니다.

  • 기본적으로 7-14 개의 URL 친화적 문자 : AZ, az, 0-9, _-
  • 비 순차적이므로 예측할 수 없습니다.
  • 하루에도 수백만 번이라도 중복없이 ID를 생성 할 수 있습니다.
  • ID를 반복하지 않고도 앱을 여러 번 다시 시작할 수 있습니다.

"ID를 반복하지 않고도 앱을 여러 번 다시 시작할 수 있습니다." shortid가 어떻게 작동하는지 보여줄 수 있습니까?
Navy Flame

@NavyFlame 여기 당신이 간다 : github.com/dylang/shortid 또는 더 구체적으로 github.com/dylang/shortid/issues/95
str

21

node-uuid 더 이상 사용되지 않으므로 사용하십시오 uuid

npm install uuid --save
// Generate a v1 UUID (time-based) 
const uuidV1 = require('uuid/v1');
uuidV1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

// Generate a v4 UUID (random) 
const uuidV4 = require('uuid/v4');
uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

Npm 링크


19

의존성이없는 간단한 시간 기반 :

(new Date()).getTime().toString(36)

산출: jzlatihl


플러스 난수 (@Yaroslav Gaponov의 답변에 감사드립니다)

(new Date()).getTime().toString(36) + Math.random().toString(36).slice(2)

산출 jzlavejjperpituute


9

더 쉽고 모듈 추가없이

Math.random().toString(26).slice(2)

2
길이에 달려 있다고 생각합니다. 이 코드를 인라인처럼 확장 할 수 있습니다.function getId(mask) { return mask.replace(/[x]/gi, () => { return Math.random().toString(26)[5]; }) } console.log(getId('xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'));
Yaroslav Gaponov

6
Math.random은 특히 임의의 ID가 필요할 때, 특히 예측 불가능하고 / 암호 적으로 안전해야하는 경우에는 좋지 않은 선택입니다.
Jecho Jekov

1
이것은 보편적으로 고유 한 ID를 생성하지 않습니다.
vicg

@JechoJekov "truly random"? 의심 스럽다
JDrake

YaroslavGaponov 는 실제 공간에서 분수가 동일 할 확률이 [0, 1] 0이므로 정확할 수 있습니다. 1,000,000 Math.random ()을 생성하는 코드를 작성하여 중복을 찾을 수 없습니다. random_numbers = [] for (i = 0; i < 1000000; i++) { random_numbers.push(Math.random()) } if (i === 1000000) { console.log("Before checking duplicate") console.log(random_numbers.length) console.log("After checking duplicate") random_set = new Set(random_numbers) console.log([...random_set].length) }
이 시앙 총

3

암호화에 강한 UUID가 필요한 사람도 있습니다.

https://www.npmjs.com/package/generate-safe-id

npm install generate-safe-id

왜 UUID가 아닙니까?

랜덤 UUID (UUIDv4) 보편적으로 고유하기에 충분한 엔트로피갖지 않습니다 (ironic , eh?). 임의의 UUID에는 122 비트 의 엔트로피 만 있으므로 2 ^ 61 후에 만 복제가 발생 함 ID . 또한 일부 UUIDv4 구현에서는 암호화 적으로 강력한 난수 생성기를 사용하지 않습니다.

이 라이브러리 는 Node.js 암호화 RNG를 사용하여 240 비트 ID를 생성 합니다. 이는 2 ^ 120 개의 ID를 생성 한 후 첫 번째 복제가 발생 함을 나타 냅니다. 인류의 현재 에너지 생산에 기초하여,이 임계 값은 가까운 미래를 넘어서는 불가능할 것입니다.

var generateSafeId = require('generate-safe-id');

var id = generateSafeId();
// id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"

9
이 답변은 generate-safe-id폐기되어 보안 취약점이 수정되어 사용자에게 더 이상 작동하지 않을 수 있습니다 (2018 년 8 월 기준)
dannypaz

1

나는 다음을 사용하고 있으며 타사 종속성없이 잘 작동합니다.

const {
  randomBytes
} = require('crypto');

const uid = Math.random().toString(36).slice(2) + randomBytes(8).toString('hex') + new Date().getTime();


1

npm에서 https://www.npmjs.com/package/uniqid 를 사용함

npm i uniqid

항상 현재 시간, 프로세스 및 컴퓨터 이름을 기반으로 고유 ID를 만듭니다.

  • 현재 시간의 ID는 단일 프로세스에서 항상 고유합니다.
  • 프로세스 ID를 사용하면 여러 프로세스에서 동시에 호출하더라도 ID가 고유합니다.
  • MAC 주소를 사용하면 여러 시스템과 프로세스에서 동시에 호출하더라도 ID가 고유합니다.

풍모:-

  • 매우 빠름
  • 여러 프로세스와 시스템에서 동시에 호출 된 경우에도 고유 ID를 생성합니다.
  • 독창성이 떨어지는 짧은 8 및 12 바이트 버전.

1

UUID를 설치하려면

npm install --save uuid

UUID가 업데이트되고 이전 가져 오기

const uuid= require('uuid/v4');

작동하지 않으며 이제이 가져 오기를 사용해야합니다

const {v4:uuid} = require('uuid');

그것을 사용하기 위해 다음과 같은 기능으로 사용하십시오 =>

const  createdPlace = {
    id: uuid(),
    title,
    description,
    location:coordinates,
    address,
    creator
  };

0

에서 확장 YaroslavGaponov 의 대답, 가장 간단한 구현은 사용하고 있습니다 Math.random().

Math.random()

실제 공간 [0, 1]에서 분수가 동일 할 확률은 이론적으로 0이며 node.js의 기본 길이는 16 진수입니다. 또한이 구현은 연산이 수행되지 않으므로 산술 오버플로를 줄여야합니다. 또한 Decimals가 문자열보다 적은 메모리를 차지하므로 문자열에 비해 메모리 효율성이 높습니다.

이것을 "Chong-Fractional-Unique-ID"라고 합니다. 나는 아직 그 속성에 관한 논문을 아직 작성하지 않았으며, 곧 그 책을 보게 될 것입니다.

1,000,000 개의 Math.random()숫자 를 생성 하고 중복을 찾을 수없는 코드를 작성했습니다 (적어도 기본 소수점 16의 경우). 아래 코드를 참조하십시오 (있는 경우 의견 제공).

random_numbers = [] 
for (i = 0; i < 1000000; i++) { 
   random_numbers.push(Math.random()) 
   //random_numbers.push(Math.random().toFixed(13)) //depends decimals default 16 
} 

if (i === 1000000) { 
   console.log("Before checking duplicate") 
   console.log(random_numbers.length) 
   console.log("After checking duplicate") 
   random_set = new Set(random_numbers) 
   console.log([...random_set].length) // length is still the same
} 

또한 소수점 이하 자릿수에 따라 다릅니다. 나는 13 자리 이상의 13 진수가 random_numbers.push(Math.random().toFixed(13))여전히 같은 길이 라는 것을 발견했다
Yi Xiang Chong
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.