नोड.जेएस के साथ यूनिक आईडी कैसे जनरेट करें


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, मुझे यह समझने की आवश्यकता है कि यह डेटाबेस क्वेरी के साथ कैसे किया जा सकता है। क्षमा करें, धन्यवाद।
उल्लू

1
यह प्रश्न डुप्लिकेट के रूप में गलत रूप से फ़्लैग किया गया है। लिंक किए गए प्रश्न का उत्तर है कि इसे सामान्य जावास्क्रिप्ट में कैसे किया जाए; इस प्रश्न का उच्चतम मूल्यांकित उत्तर नोड के लिए विशिष्ट है।
माइक पोस्ट

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);
सेलेबी

यह new mongo.ObjectID();मैन्युअल रूप से stackoverflow.com/a/56106999/4701635 के
परेश बरद

जवाबों:


18

जब से मैंने नोड.जेएस का उपयोग किया है, तब से कुछ समय हो गया है, लेकिन मुझे लगता है कि मैं मदद करने में सक्षम हो सकता हूं।

सबसे पहले, नोड में, आपके पास केवल एक ही धागा है और कॉलबैक का उपयोग करने वाला है। आपके कोड के साथ क्या होगा, यह है कि 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 वर्षों में किसी भी नोड / जेएस को कोडित नहीं किया है और यह परीक्षण नहीं किया है, लेकिन मूल विचार को पकड़ना चाहिए - एक व्यस्त लूप का उपयोग न करें, और कॉलबैक का उपयोग करें। आप नोड async पैकेज पर एक नज़र रखना चाहते हो सकता है।


4
जब सही मायने में यादृच्छिक आईडी की आवश्यकता होती है, तो Math.random एक गरीब विकल्प है, खासकर अगर इसे अप्रत्याशित / क्रिप्टोग्राफिक सुरक्षा की आवश्यकता होती है।
Jecho Jekov

326

एनपीएम uuid पैकेज स्थापित करें (स्रोत: https://github.com/kelektiv/node-uuid ):

npm install uuid

और अपने कोड में इसका उपयोग करें:

var uuid = require('uuid');

फिर कुछ आईडी बनाएं ...

// 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' 

धन्यवाद, लेकिन मुझे इसे डेटाबेस क्वेरी के साथ करने की आवश्यकता है। :)
उल्लू

@ मुझे समझ में नहीं आ रहा है कि आपका क्या मतलब है। SQL में?
Vinz243

51
यदि यह db क्वेरी में है तो क्या फर्क पड़ता है? आपके पास एक अद्वितीय आईडी है, अब आप इसे जिस भी इंटरफ़ेस में उपयोग करते हैं, उसे अपने डेटाबेस के साथ संचार करने के लिए उपयोग करें।
१ede'१४ को

किसी भी विचार क्या संकुल uuid और नोड- uuid के बीच अंतर है?
ishandutta2007

5
@ ishandutta2007 नोड-uuid को पदावनत किया गया है: "निर्धारित: इसके बजाय uid का उपयोग करें।"
दीवत्सु

237

देशी cryptoमॉड्यूल का उपयोग करके नोड में यादृच्छिक 32-चार तार बनाने का सबसे तेज़ संभव तरीका है :

const crypto = require("crypto");

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

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

53
मुझे यह समाधान पसंद है क्योंकि किसी बाहरी निर्भरता की आवश्यकता नहीं है। इसके अलावा मैंने पाया कि base64 संस्करण भी उपयोगी है। crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
हिरोशी

5
क्या यह यादृच्छिक या अद्वितीय है? कृपया यादृच्छिक कार्य को विस्तृत करें।
मैक्सिमी

'क्रिप्टोग्राफिक रूप से मजबूत छद्म यादृच्छिक डेटा उत्पन्न करता है।' एपीआई
स्टैनिस्लासद्रग मोनिका

1
cryptoअब नोड में ही बनाया गया है .. अगर आप 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
npm

1
यह अब पदावनति चेतावनियों का कारण बनता है।
रज़्ज़े

34

एक अन्य दृष्टिकोण एनपीएम से शॉर्टिड पैकेज का उपयोग कर रहा है ।

यह इस्तेमाल में बहुत आसान है:

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

और कुछ सम्मोहक विशेषताएं हैं:

ShortId आश्चर्यजनक रूप से छोटे गैर-अनुक्रमिक यूआरएल-अनुकूल अद्वितीय आईडी बनाता है। Url शॉर्टर्स, MongoDB और Redis आईडी के लिए बिल्कुल सही, और कोई अन्य आईडी उपयोगकर्ता देख सकते हैं।

  • डिफ़ॉल्ट रूप से 7-14 url-friendly अक्षर: AZ, az, 0-9, _-
  • गैर-अनुक्रमिक इसलिए वे अनुमानित नहीं हैं।
  • डुप्लिकेट के बिना किसी भी आईडी की संख्या उत्पन्न कर सकते हैं, यहां तक ​​कि प्रति दिन लाखों।
  • बिना आईडी दोहराए किसी भी समय ऐप को किसी भी समय फिर से शुरू किया जा सकता है।

"आईडी को दोहराने के किसी भी अवसर के बिना ऐप्स को कितनी भी बार फिर से शुरू किया जा सकता है?" क्या आप मुझे दिखा सकते हैं कि कैसे काम करता है?
नेवी फ्लेम

@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'));
यारोस्लाव गैपोनोव

6
जब सही मायने में यादृच्छिक आईडी की आवश्यकता होती है, तो Math.random एक गरीब विकल्प है, खासकर अगर इसे अप्रत्याशित / क्रिप्टोग्राफिक सुरक्षा की आवश्यकता होती है।
Jecho Jekov

1
यह वास्तव में सार्वभौमिक रूप से अद्वितीय आईडी उत्पन्न नहीं करेगा।
vicg

@JechoJekov "वास्तव में यादृच्छिक"? मुझे इसमें संदेह है
JDrake

हां यारोस्लाव गैपोनोव सही हो सकता है क्योंकि वास्तविक स्थान [0, 1] में भिन्नों के समान होने की संभावना 0 है। 1,000,000 माथ.ग्रैंडम () उत्पन्न करने के लिए कोड लिखा और कोई डुप्लिकेट नहीं मिल सका। 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

यदि किसी को क्रिप्टोग्राफिक-मजबूत यूयूआईडी की आवश्यकता है, तो उसके लिए भी समाधान है।

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

npm install generate-safe-id

UUIDs क्यों नहीं?

रैंडम यूयूआईडी (यूयूआईडीवी 4) में सार्वभौमिक रूप से अद्वितीय होने के लिए पर्याप्त एन्ट्रापी नहीं है (विडंबना, एह?)। रैंडम यूयूआईडी में केवल 122 बिट्स एन्ट्रापी हैं, जो बताता है कि केवल 2 ^ 61 आईडी के बाद एक डुप्लिकेट होगा । इसके अतिरिक्त, कुछ यूयूआईडीवी 4 कार्यान्वयन क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक संख्या जनरेटर का उपयोग नहीं करते हैं।

यह लाइब्रेरी Node.js क्रिप्टो RNG का उपयोग करके 240-बिट आईडी उत्पन्न करती है , यह सुझाव देते हुए कि 2 ^ 120 ID बनाने के बाद पहली डुप्लिकेट आएगी । मानव जाति के वर्तमान ऊर्जा उत्पादन के आधार पर, यह सीमा भविष्य के भविष्य के लिए पार करना असंभव होगा।

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

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

9
यह उत्तर उपयोगकर्ताओं के लिए अब काम नहीं करने के कारण generate-safe-idछोड़ दिया जा सकता है और सुरक्षा कमजोरियों को ठीक नहीं किया जा रहा है (अगस्त 2018 तक)
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

यह हमेशा मौजूदा समय, प्रक्रिया और मशीन के नाम के आधार पर अद्वितीय आईडी बनाएगा।

  • मौजूदा समय के साथ आईडी एकल प्रक्रिया में हमेशा विशिष्ट होती है।
  • प्रोसेस आईडी के साथ आईडी कई प्रक्रियाओं से एक ही समय में कॉल किए जाने पर भी अद्वितीय है।
  • मैक पते के साथ आईडी कई मशीनों और प्रक्रियाओं से एक ही समय में बुलाया जाता है, भले ही अद्वितीय हैं।

विशेषताएं:-

  • बहुत तेज़
  • कई प्रक्रियाओं और मशीनों पर अद्वितीय आईडी बनाता है, भले ही एक ही समय में कहा जाता हो।
  • कम विशिष्टता के साथ शॉर्टर 8 और 12 बाइट संस्करण।

1

uuid स्थापित करने के लिए

npm install --save uuid

uuid अपडेट किया गया है और पुराना आयात है

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

काम नहीं कर रहा है और हमें अब इस आयात का उपयोग करना चाहिए

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

और इसे उपयोग करने के लिए एक funciton की तरह उपयोग करें =>

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

0

यारोस्लाव गैपोनोव के उत्तर से विस्तार , सबसे सरल कार्यान्वयन बस उपयोग कर रहा है Math.random()

Math.random()

एक वास्तविक स्थान में अंशों के समान होने की संभावना [0, 1] सिद्धांत रूप से 0 है और नोड में 16 दशमलव की डिफ़ॉल्ट लंबाई के लिए लगभग 0 के करीब है। और इस कार्यान्वयन को अंकगणितीय अतिप्रवाह को भी कम करना चाहिए क्योंकि कोई संचालन नहीं किया जाता है। इसके अलावा, यह एक स्ट्रिंग की तुलना में अधिक मेमोरी कुशल है, क्योंकि डेसीमल स्ट्रिंग्स की तुलना में कम मेमोरी पर कब्जा कर लेता है।

मैं इसे "चोंग-फ्रैक्शनल-यूनिक-आईडी" कहता हूं । मैंने अभी भी इसके गुणों के बारे में एक पेपर नहीं लिखा है, जो उम्मीद है कि मुझे जल्द ही मिल जाएगा।

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 डेसीमल से ऊपर random_numbers.push(Math.random().toFixed(13))अभी भी वही लंबाई है
यी जियांग चोंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.