สร้างหมายเลขเฉพาะด้วยเวลาจาวาสคริปต์


101

ฉันต้องการสร้างหมายเลขประจำตัวที่ไม่ซ้ำกันในทันทีโดยใช้จาวาสคริปต์ ที่ผ่านมาฉันได้ทำสิ่งนี้โดยการสร้างตัวเลขโดยใช้เวลา ตัวเลขจะประกอบด้วยปีสี่หลักเดือนสองหลักวันสองหลักชั่วโมงสองหลักนาทีสองหลักสองหลักวินาทีและสามหลักมิลลิวินาที มันจะมีลักษณะดังนี้: 20111104103912732 ... นี่จะให้ความแน่นอนเพียงพอสำหรับหมายเลขเฉพาะสำหรับวัตถุประสงค์ของฉัน

เป็นเวลานานแล้วที่ฉันทำสิ่งนี้และฉันไม่มีรหัสอีกต่อไป ใครมีรหัสในการทำเช่นนี้หรือมีข้อเสนอแนะที่ดีกว่าในการสร้าง ID เฉพาะ


5
อาจซ้ำกันได้ของHow to create a GUID / UUID in Javascript?
Lilleaas สิงหาคม

พิจารณาแล้วnew Date().toISOString ()หรือยัง?
gaspard

คำตอบ:


68

หากคุณต้องการเพียงแค่ตัวเลขที่ไม่ซ้ำกัน

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: ฉันไม่ได้บอกว่ามันไม่เหมือนใคร แต่ฉันบอกว่ามันเป็น "unique-ish" แน่นอนว่าการใช้การประทับเวลาที่สร้างขึ้นในฝั่งไคลเอ็นต์จะสร้างสิ่งที่ผิดพลาด
Marc B

79
การประทับเวลาควรจะผลตอบแทนเป็นจำนวนระหว่าง 0 และ 999 ผลตอบแทนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 (การประทับเวลาปกติ) w3schools.com/jsref/jsref_obj_date.aspnew Date().getTime();date.getUTCMilliseconds()date.getTime()
Automatico

8
-1 เนื่องจากคำถามเกี่ยวกับหมายเลขเฉพาะ ควรเว้นโค้ดบล็อกแรกทั้งหมด
Andrey

สิ่งนี้สามารถสร้างค่าที่ไม่ซ้ำกันได้ 2 ค่า:function foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
Sharikov Vladislav

10
The value returned by getUTCMilliseconds() is an integer between 0 and 999.getUTCMilliseconds นี่เป็นแนวคิดที่แย่ที่สุดสำหรับ id ที่ไม่ซ้ำกันควรลบย่อหน้าแรก
gaspard

120

แนวทางที่ดีกว่าคือ:

new Date().valueOf();

แทน

new Date().getUTCMilliseconds();

valueOf ()คือ "น่าจะเป็น" ตัวเลขที่ไม่ซ้ำกัน http://www.w3schools.com/jsref/jsref_valueof_date.asp


19
ไม่ใช่ตัวเลขที่ไม่ซ้ำกัน .. มิลลิวินาทีไม่ละเอียดพอที่จะถือว่าไม่ซ้ำกัน
Vamsi Mohan Jayanti

3
หรือง่ายๆ+new Date()
thdoan

1
ฉันเพิ่งวิ่งวนรอบและได้ผลลัพธ์ที่ซ้ำกับvalueOf(). ฉันเพิ่งใช้สิ่งนี้ - +performance.now().toString().replace('.', 7) developer.mozilla.org/en-US/docs/Web/API/Performance/now
Itzik Ben Hutta

1
@ItzikBenHutta Got 3 เท่าเดิมค่า การใช้ซีพียูแบบมัลติคอร์อาจเป็นเงื่อนไขการแข่งขันกับเธรด
ที่สนามบิน Ben

73

วิธีที่สั้นที่สุดในการสร้างตัวเลขที่คุณค่อนข้างมั่นใจได้ว่าจะไม่ซ้ำกันท่ามกลางอินสแตนซ์ต่างๆที่คุณคิดได้ก็คือ

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

3
นี่ควรเป็นคำตอบที่ยอมรับเมื่อลองคำตอบอื่น ๆ ที่ได้รับการโหวตสูงกว่าฉันได้ 2 และ 3 เท่าของค่าเดียวกันในแถวเมื่อโทรจากฟังก์ชัน async ดูเหมือนว่าจะมีการสุ่มเพียงพอสำหรับซีพียู 8 คอร์มาตรฐานเพื่อสร้าง 8 สตริงที่ไม่ซ้ำกันในเวลาเดียวกันซึ่งดีพอสำหรับการใช้งาน
ที่สนามบิน Ben

ที่ดีที่สุด:Date.now() + '' + Math.random()
NSD

Date.now()ส่วนจะไร้ประโยชน์เมื่อสิ่งนี้จะอยู่ในวงรอบง่าย / เร็ว
APu

23

สามารถทำได้ง่ายๆด้วยรหัสต่อไปนี้:

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: "สิ่งนี้จะให้ความแน่นอนเพียงพอสำหรับหมายเลขเฉพาะสำหรับวัตถุประสงค์ของฉัน"
สิงหาคม Lilleaas

18

นี่คือสิ่งที่ฉันทำเมื่อต้องการบางสิ่งที่เล็กกว่าตัวเลขจำนวนมาก - เปลี่ยนฐาน

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

1
@blushrt จริงอาจทำให้เกิดการปะทะกันที่หายาก คุณสามารถ md5 การประทับเวลาได้โดยใช้code.google.com/p/crypto-jsแต่สำหรับจุดประสงค์ของฉันมัน "ไม่ซ้ำใครมากพอ" และที่สำคัญเร็วกว่านั้น
frumbert

@frumbert มันขึ้นอยู่กับ MD5 ไม่ทนต่อการชนเช่นกัน แต่ในกรณีของคุณฉันมีปัญหาอย่างรวดเร็วเนื่องจาก toString (36) ซึ่งฉันถือว่าแปลงค่าตัวเลขเป็นการแสดง ascii ไม่แน่ใจ แต่ฉันสามารถเห็นปัญหาได้ถ้าคุณเรียกตัวสร้าง uuid บ่อยพอเพียง 3 ครั้งสุดท้าย ตัวอักษรมีการเปลี่ยนแปลงดังนั้นโอกาสสูงที่คุณจะชนกัน คุณจะได้รับอัตราต่อรองที่ดีขึ้นมากหากคุณติดการโทร Date.getTime () ใหม่ แต่เดี๋ยวก่อนถ้ามันใช้งานได้ตามวัตถุประสงค์ของคุณก็ไม่มีปัญหาฉันต้องการมันสำหรับรหัสเฉพาะบางอย่างสำหรับโค้ดฝั่งไคลเอ็นต์ของฉันเท่านั้นซึ่งลงเอยด้วยการใช้ uuid node lib
blushrt

ฉันรักคนนี้! ฉันได้ปรับเป็น(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
สำหรับฉันแล้วดูเหมือนว่าการเพิ่มตัวเลขสุ่มจะทำให้หลักฐานน้อยลง ด้วยการประทับเวลาตัวเลขสองตัวจะต้องถูกสร้างขึ้นในมิลลิวินาทีเดียวกันจึงจะเหมือนกัน การเพิ่มตัวเลขสุ่มสองตัวตอนนี้คุณได้สร้างชุดค่าผสมของตัวเลขจำนวนมากเนื่องจากคณิตศาสตร์ซึ่งอาจได้ผลลัพธ์เดียวกันเมื่อคูณ ฉันรู้ว่ามันไม่น่าเป็นไปได้ แต่ ...
ฟิลิป

อืมใช่ บางทีคำตอบของฉันกับคำตอบของ abarber อาจจะดีที่สุด
Steven Vachon

อัปเดตคำตอบของฉัน ขอบคุณสำหรับความคิด
Steven Vachon

2
ความพยายามอย่างดีไม่ได้พยายามเลือกคำตอบของคุณ ... แต่วิธีการใหม่นี้ไม่ได้ช่วยแก้ปัญหา "มากกว่าหนึ่ง id ที่สร้างขึ้นในมิลลิวินาทีเดียวกัน" เพราะรู้ไหม .. มันคือจาวาสคริปต์ในฝั่งไคลเอ็นต์ หากผู้ใช้รายอื่นสร้างตัวเลขในมิลลิวินาทีเดียวกันตัวเลขนั้นจะไม่ปรากฏใน uniqueNumber ก่อนหน้าผู้ใช้ "อื่น ๆ " เว้นแต่คุณจะจัดเก็บไว้ในเซิร์ฟเวอร์ที่ไหนสักแห่งและตรวจสอบความเป็นเอกลักษณ์ ... ไม่มีทางที่โซลูชันที่ใช้ js อย่างหมดจดเช่นนี้จะมั่นใจได้ว่าเป็นการสร้างหมายเลขเฉพาะ
ฟิลิป

นั่นจะเป็นระบบที่ซับซ้อนมากกว่าแค่จำนวนเฉพาะ
Steven Vachon

12

ฉันใช้

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

ดังนั้นหากมีโอกาสที่รหัสถูกยิงพร้อมกันก็มีโอกาสเล็กน้อยที่ตัวเลขสุ่มจะเหมือนกัน


ไม่แน่ใจว่าnew Date()มีประโยชน์ยาก คุณจะได้รับหมายเลขเดียวกันโดยมีวันที่ต่างกันสองวัน
JMaylin

1
ฉันหมายความว่ามันดีกว่าการทำง่ายๆMath.random()อย่างไร?
JMaylin

7

สิ่งนี้ควรทำ:

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

1
มีประโยชน์สำหรับหลาย ๆ กรณีแม้ว่าสิ่งนี้จะไม่ได้สร้างรหัส "เฉพาะ" ที่บริสุทธิ์ แต่ในกรณีที่ฟังก์ชันนี้ถูกเรียกใช้หลายครั้งในมิลลิวินาทีเดียวกัน ... แต่อย่างไรก็ตามสำหรับการโต้ตอบกับผู้ใช้และ UI ก็เป็นสิ่งที่ดี
Benjamin Piette

1
นี่ควรเป็นคำตอบที่ยอมรับได้ อึที่ไม่เกี่ยวข้องจำนวนมากซึ่งยากและไม่จำเป็นและคำตอบนี้ให้เวลาที่ไม่ซ้ำกันในแต่ละมิลลิวินาที
ยีนข.

6

หากคุณต้องการหมายเลขที่ไม่ซ้ำกันหลังจากนั้นไม่กี่ mili วินาทีให้ใช้Date.now()ถ้าคุณต้องการใช้ภายในfor loopแล้วใช้Date.now() and Math.random()ร่วมกัน

หมายเลขเฉพาะภายในสำหรับลูป

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

จากการตรวจสอบออนไลน์ฉันได้มาพร้อมกับวัตถุต่อไปนี้ที่สร้างรหัสเฉพาะต่อเซสชัน:

        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 เสมอ

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

getUniqueId()    // Call the function

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

//"ka2high4264"

//"ka2hj115905"

//"ka2hj1my690"

//"ka2hj23j287"

//"ka2hj2jp869"

สิ่งนี้จะไม่ให้คุณค่าที่ไม่เหมือนใครอย่างแท้จริงลองใช้รหัสนี้[1,2,3,5,6,7,8,9,10].map(item => getUniqueId());
APu

2

ในปี 2020 คุณสามารถใช้Crypto APIในเบราว์เซอร์เพื่อสร้างค่าสุ่มที่แข็งแกร่งในการเข้ารหัส

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

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

ทั้งUint8ArrayและCrypto.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 อักขระที่รับประกันเกือบไม่ซ้ำกันหากคุณต้องการเพียงแค่ตัวเลขเปลี่ยน "ตัวอักษร" 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')) // จะซับซ้อน

เอาท์พุทตัวอย่าง:
สำหรับ (var i = 0; ฉัน <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804


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

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

ตัวอย่างผลลัพธ์ "k3jobnvt_15750033412250_18299601769317408"


0

สันนิษฐานว่าโซลูชันที่เสนอโดย@abarberเป็นทางออกที่ดีเนื่องจากการใช้งาน(new Date()).getTime()จึงมีช่วงเวลามิลลิวินาทีและผลรวมtickในกรณีที่เกิดการชนกันในช่วงเวลานี้เราสามารถพิจารณาใช้บิวท์อินได้ตามที่เห็นได้ชัดเจนในการดำเนินการที่นี่:

เราสามารถดูได้ที่นี่ว่าจะมีการชนกันในกรอบหน้าต่าง 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 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

ใช้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 วันนี้ = วันที่ใหม่ (). valueOf ();

console.log (วันนี้);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.