নোড.জেএস সহ কীভাবে অনন্য আইডি তৈরি করা যায়


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;
}

কীভাবে ডাটাবেস ক্যোয়ারী কলব্যাকের সাথে একটি ভেরিয়েবল মান সেট করবেন? আমি কীভাবে এটি করতে পারি?


@ জেমস অ্যালার্ডিস, আমাকে কীভাবে এটি একটি ডেটাবেস ক্যোয়ারী দিয়ে করা যায় তা বুঝতে হবে। দুঃখিত, ধন্যবাদ
পেঁচা

1
এই প্রশ্নটিকে নকল হিসাবে ভুলভাবে পতাকাঙ্কিত করা হয়েছে। লিঙ্কযুক্ত প্রশ্নটি জেনেরিক জাভাস্ক্রিপ্টে এটি কীভাবে করবেন তা উত্তর দেয়; এই প্রশ্নের সর্বাধিক রেট দেওয়া উত্তর নোড.জেএস-এর জন্য নির্দিষ্ট is
মাইক পোস্ট

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();এবং ম্যানুয়ালি স্ট্যাকওভারফ্লো.com/
পরেশ বড়দ

উত্তর:


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 বছরে কোনও নোড / জেএস কোড করি নি এবং এটি পরীক্ষা করে দেখিনি, তবে প্রাথমিক ধারণাটি থাকা উচিত - একটি ব্যস্ত লুপ ব্যবহার করবেন না এবং কলব্যাকগুলি ব্যবহার করবেন না। আপনি নোড অ্যাসিঙ্ক প্যাকেজটি একবার দেখতে চান।


4
সত্যিকারের এলোমেলো আইডি দরকার হলে ম্যাথআর্যান্ডম একটি দুর্বল পছন্দ, বিশেষত যদি এটি অনির্দেশ্য / ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হওয়া প্রয়োজন।
জেচো জেকোভ

324

এনপিএম ইউইড প্যাকেজ ইনস্টল করুন (উত্স: 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'

** ৩.১.০ আপডেট করুন
উপরের ব্যবহারটি হ্রাস করা হয়েছে , সুতরাং এই প্যাকেজটি এটির মতো ব্যবহার করুন:

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

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

** DATE.x আপডেট করুন
এবং এখন উপরের ব্যবহারটিও হ্রাস করা হয়েছে , সুতরাং এই প্যাকেজটি এভাবে ব্যবহার করুন:

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

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

ধন্যবাদ, তবে আমার এটি একটি ডাটাবেস ক্যোয়ারী দিয়ে করা দরকার। :)
পেঁচা

@ পেঁচা আপনি কী বলতে চাইছেন তা আমি বুঝতে পারি না। এসকিউএল এ?
Vinz243

51
এটি কোনও ডিবি কোয়েরিতে থাকলে কী পার্থক্য হবে? আপনার একটি অনন্য আইডি রয়েছে, এখন আপনি আপনার ডাটাবেসের সাথে যোগাযোগের জন্য যে কোনও ইন্টারফেসে ব্যবহার করুন।
জেরেদ

ইউয়েড এবং নোড-ইউইড প্যাকেজগুলির মধ্যে পার্থক্য কী?
ishandutt2007

5
@ ishandutt2007 নোড-ইউইড অবমূল্যায়ন করা হয়েছে: "সম্মত: পরিবর্তে ইউইড প্যাকেজটি ব্যবহার করুন।"
diutsu

236

নোডে এলোমেলো 32-চর স্ট্রিং তৈরির দ্রুততম উপায় হল নেটিভ cryptoমডিউলটি ব্যবহার করে :

const crypto = require("crypto");

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

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

53
আমি এই সমাধানটি পছন্দ করি কারণ কোনও বাহ্যিক নির্ভরতার প্রয়োজন নেই। এছাড়াও আমি পেয়েছি বেস 64 সংস্করণটিও দরকারী u crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
হিরোশি

5
এটি এলোমেলো বা অনন্য? অনুগ্রহ করে এলোমেলো ফাংশনটি বিস্তারিতভাবে বর্ণনা করুন।
ম্যাক্সিমি

'ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী সিউডো-এলোমেলো ডেটা উত্পন্ন করে।' API
Stanislasdrg মনিকা

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
এনটিএম

1
এটি এখন অবমূল্যায়নের সতর্কতাগুলির কারণ হয়ে থাকে।
রাজে

34

আর একটি পদ্ধতি এনপিএম থেকে সংক্ষিপ্ত প্যাকেজটি ব্যবহার করছে ।

এটা ব্যবহার করা খুব সহজ:

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

এবং কিছু আকর্ষণীয় বৈশিষ্ট্য রয়েছে:

শর্টআইডি আশ্চর্যজনকভাবে সংক্ষিপ্ত অ-অনুক্রমিক url- বান্ধব অনন্য আইডি তৈরি করে। ইউআরএল সংক্ষিপ্তকারী, মোঙ্গোডিবি এবং রেডিস আইডির জন্য উপযুক্ত এবং অন্য কোনও আইডি ব্যবহারকারী দেখতে পাবেন।

  • ডিফল্ট 7-14 ইউআরএল-বান্ধব অক্ষরগুলি: এজেড, এজেড, 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' 

এনপিএম লিঙ্ক


19

সহজ, সময় ভিত্তিক, নির্ভরতা ছাড়াই:

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

আউটপুট: jzlatihl


প্লাস এলোমেলো সংখ্যা (@ ইয়ারোস্লাভ গাপোনভের জবাবের জন্য ধন্যবাদ)

(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
সত্যিকারের এলোমেলো আইডি দরকার হলে ম্যাথআর্যান্ডম একটি দুর্বল পছন্দ, বিশেষত যদি এটি অনির্দেশ্য / ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হওয়া প্রয়োজন।
জেচো জেকোভ

1
এটি সত্যই সর্বজনীন অনন্য আইডি উত্পন্ন করবে না।
vicg

@ জেকো জেকভ "সত্যই এলোমেলো"? আমি সন্দেহ করি
জেড্রেক

হ্যাঁ ইয়ারোস্লাভ গ্যাপনোভ একটি সত্যিকারের জায়গাতে ভগ্নাংশের সম্ভাবনা সমান হওয়ার কারণ সঠিক হতে পারে [০, ১] ০.০০,০০০ ম্যাথ.র্যান্ডম () উত্পাদনের জন্য লিখিত কোড লিখেছিল এবং কোনও সদৃশ খুঁজে পেল না। 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

ইউআইডি গুলো কেন নয়?

র্যান্ডম ইউইউআইডিএস (ইউআইডিএভি 4) এর সর্বজনীন অনন্য (লৌহ , এহ?) হওয়ার মতো পর্যাপ্ত এনট্রপি নেই । এলোমেলো ইউআইডিগুলিতে কেবলমাত্র ইন্ট্রপির 122 বিট রয়েছে, যা কেবল 2 a 61 আইডি পরে একটি সদৃশ ঘটবে বলে মনে করে । অতিরিক্তভাবে, কিছু ইউআইডিভি 4 বাস্তবায়ন ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী এলোমেলো নম্বর জেনারেটর ব্যবহার করে না।

এই গ্রন্থাগারটি নোড.জেএস ক্রিপ্টো আরএনজি ব্যবহার করে 240-বিট আইডি তৈরি করে, প্রস্তাবিত প্রথম নকলটি 2 ^ 120 আইডি তৈরির পরে ঘটবে । মানব জাতির বর্তমান শক্তি উত্পাদন উপর ভিত্তি করে, এই প্রান্তিক অদূর ভবিষ্যতের জন্য অতিক্রম করা সম্ভব হবে।

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

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

9
এই উত্তরটি generate-safe-idপরিত্যক্ত হওয়ার কারণে এবং সুরক্ষা দুর্বলতাগুলি ঠিক না হওয়ার কারণে ব্যবহারকারীদের পক্ষে আর কাজ করা হতে পারে না (আগস্ট 2018 হিসাবে)
ড্যানিপাজ

1

আমি নিম্নলিখিতটি ব্যবহার করছি এবং এটি কোনও তৃতীয় পক্ষের নির্ভরতা ছাড়াই ভাল প্লাসে কাজ করছে।

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

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

1

এগুলির সমাধানগুলি পুরানো এবং এখন হ্রাস করা হয়েছে: https://github.com/uuidjs/uuid# ਦੀਪ-requires-now-drecated

এটা ব্যবহার কর:

এনপিএম ইনস্টল করুন

//add these lines to your code
const { v4: uuidv4 } = require('uuid');
var your_uuid = uuidv4();
console.log(your_uuid);

1

এনএমপি তে https://www.npmjs.com/package/uniqid ব্যবহৃত হয়েছে

npm i uniqid

এটি সর্বদা বর্তমান সময়, প্রক্রিয়া এবং মেশিনের নামের উপর ভিত্তি করে অনন্য আইডি তৈরি করবে।

  • বর্তমান সময়ের সাথে আইডি একক প্রক্রিয়ায় সর্বদা অনন্য।
  • প্রসেস আইডির সাথে আইডি একাধিক প্রক্রিয়া থেকে একই সময়ে কল করা হলেও অনন্য।
  • একাধিক মেশিন এবং প্রক্রিয়াগুলি থেকে একই সময়ে কল করা হলেও ম্যাক ঠিকানার সাথে আইডি অনন্য।

বৈশিষ্ট্য: -

  • খুব দ্রুত
  • একই সাথে ডাকা হলেও একাধিক প্রক্রিয়া এবং মেশিনে অনন্য আইডি তৈরি করে।
  • স্বল্প 8 এবং 12 স্বতন্ত্রতা সহ 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

ইয়ারোস্লাভ গ্যাপনোভের উত্তর থেকে প্রসারিত , সহজ প্রয়োগটি কেবল ব্যবহার করছে 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))এখনও একই দৈর্ঘ্য দেয়
ই শি জিয়াং চং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.