Tạo một số duy nhất với thời gian javascript


95

Tôi cần tạo số id duy nhất nhanh chóng bằng cách sử dụng javascript. Trước đây, tôi đã làm điều này bằng cách tạo một số sử dụng thời gian. Số sẽ được tạo thành từ năm bốn chữ số, tháng hai chữ số, ngày hai chữ số, giờ hai chữ số, phút hai chữ số, giây hai chữ số và ba chữ số mili giây. Vì vậy, nó sẽ trông giống như sau: 20111104103912732 ... điều này sẽ đủ chắc chắn về một số duy nhất cho mục đích của tôi.

Đã một thời gian kể từ khi tôi làm điều này và tôi không có mã nữa. Bất kỳ ai có mã để thực hiện việc này hoặc có đề xuất tốt hơn để tạo một ID duy nhất?



Bạn đã xem xét new Date().toISOString ()?
thở hổn hển

Câu trả lời:


66

Nếu bạn chỉ muốn một số ish duy nhất, thì

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

sẽ giúp bạn có được một con số đơn giản. Nhưng nếu bạn cần phiên bản có thể đọc được, bạn phải xử lý một chút:

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: Tôi không nói nó là duy nhất, tôi nói nó là "unique-ish". tất nhiên, việc sử dụng phía máy khách được tạo dấu thời gian sẽ tạo ra các lỗi giả mạo.
Marc B

78
dấu thời gian phải là new Date().getTime();số date.getUTCMilliseconds()trả về từ 0 đến 999. date.getTime()trả về mili giây kể từ ngày 1 tháng 1 năm 1970. (dấu thời gian bình thường). w3schools.com/jsref/jsref_obj_date.asp
Automatico

8
-1, vì câu hỏi là về số duy nhất . Khối mã đầu tiên nên được bỏ qua hoàn toàn.
Andrey

Điều này có thể tạo ra 2 giá trị duy nhất:function foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
Sharikov Vladislav

10
getUTCMilliseconds The value returned by getUTCMilliseconds() is an integer between 0 and 999.. Đây là ý tưởng tồi tệ nhất cho id duy nhất, đoạn đầu tiên nên được xóa.
thở hổn hển

116

Một cách tiếp cận tốt hơn sẽ là:

new Date().valueOf();

thay vì

new Date().getUTCMilliseconds();

valueOf () "rất có thể" là một số duy nhất. http://www.w3schools.com/jsref/jsref_valueof_date.asp .


19
Nó không phải là một số duy nhất .. mili giây không đủ chi tiết để được coi là duy nhất.
Vamsi Mohan Jayanti

3
Hoặc đơn giản+new Date()
thdoan

1
Tôi vừa chạy một vòng lặp for và tôi nhận được kết quả trùng lặp với valueOf(). Tôi chỉ sử dụng cái này - +performance.now().toString().replace('.', 7) developer.mozilla.org/en-US/docs/Web/API/Performance/now
Itzik Ben Hutta

1
@ItzikBenHutta Có cùng giá trị gấp 3 lần. Sử dụng CPU đa nhân, có lẽ là một điều kiện chạy đua với các luồng.
that-ben

68

Cách ngắn nhất để tạo một số mà bạn có thể khá chắc chắn sẽ là duy nhất trong số rất nhiều trường hợp riêng biệt mà bạn có thể nghĩ đến là

Date.now() + Math.random()

Nếu có sự khác biệt 1 phần nghìn giây trong lệnh gọi hàm, thì đó là 100% đảm bảo sẽ tạo ra một số khác . Đối với các lệnh gọi hàm trong cùng một phần nghìn giây, bạn chỉ nên bắt đầu lo lắng nếu bạn đang tạo hơn một vài triệu số trong cùng một phần nghìn giây này, điều này không có khả năng xảy ra.

Để biết thêm về xác suất nhận được một số lặp lại trong cùng một phần nghìn giây, hãy xem https://stackoverflow.com/a/28220928/4617597


7
Ngoài ra, nếu bạn muốn giữ tất cả các bit của số ngẫu nhiên, bạn có thể tạo chúng riêng biệt và hợp nhất dưới dạng chuỗi: new Date (). ValueOf (). ToString (36) + Math.random (). ToString (36) .substr (2) Điều đó sẽ cung cấp cho bạn một chuỗi gồm 19 ký tự chữ và số là một lượng entropy khá lớn. Mặc dù một nửa của nó là có thể dự đoán được.
Erik Pukinskis,

2
Đây phải là câu trả lời được chấp nhận vì khi thử các câu trả lời được bình chọn cao hơn khác, tôi đã nhận được 2 và thậm chí 3 lần cùng một giá trị liên tiếp khi gọi từ một hàm không đồng bộ. Điều này dường như cung cấp đủ ngẫu nhiên để một CPU 8 nhân tiêu chuẩn tạo ra 8 chuỗi duy nhất chính xác tại cùng một thời điểm, đủ tốt cho mục đích sử dụng của tôi.
that-ben

22

Điều này có thể đạt được đơn giản với đoạn mã sau:

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
điều gì sẽ xảy ra nếu điều này được gọi là hai lần trong cùng một mili giây?
TBE

1
Thật vậy, nhưng nó không sao cho op: "điều này sẽ cung cấp đủ chắc chắn về một số duy nhất cho mục đích của tôi."
Tháng 8 Lilleaas

17

Đây là những gì tôi làm khi tôi muốn thứ gì đó nhỏ hơn một loạt các số - thay đổi cơ số.

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

1
@blushrt true, nó có thể gây ra xung đột hiếm gặp. Bạn có thể md5 dấu thời gian bằng cách sử dụng mã nào đó như code.google.com/p/crypto-js , nhưng đối với mục đích của tôi, nó "đủ độc đáo" và quan trọng hơn là nhanh hơn.
frumbert

@frumbert, tùy. MD5 cũng không có khả năng chống va chạm. Nhưng trong trường hợp của bạn, tôi gặp rắc rối rất nhanh vì toString (36) mà tôi cho rằng chuyển đổi giá trị số thành biểu diễn ascii của nó, mặc dù không chắc chắn, nhưng tôi có thể thấy vấn đề, nếu bạn thường xuyên gọi trình tạo uuid của mình, chỉ có 3 ký tự đang thay đổi nên khả năng cao là bạn sẽ bị va chạm. Bạn sẽ nhận được tỷ lệ cược tốt hơn nhiều nếu bạn chỉ sử dụng các lệnh gọi Date.getTime () mới. Nhưng này nếu nó hoạt động cho mục đích của bạn, không vấn đề gì, tôi cần nó cho một số id duy nhất chỉ dành cho mã phía khách hàng của tôi, cuối cùng đã sử dụng lib nút uuid.
blushrt

Tôi yêu cái này! Tôi đã điều chỉnh nó (Date.now() + Math.random()).toString(36)để ngăn xung đột mili giây. Nó ngắn và tạo ra một cái gì đó giống như "k92g5pux.i36"
Edward

16

Điều này thực hiện nhanh hơn việc tạo một Datephiên bản, sử dụng ít mã hơn và sẽ luôn tạo ra một số duy nhất (cục bộ):

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/

Tôi đã phát hành cái này trên Bower và npm: https://github.com/stevenvachon/unique-number

Bạn cũng có thể sử dụng một cái gì đó phức tạp hơn như cuid , puid hoặc shortid để tạo ra một số không phải là số.


1
Đối với tôi, dường như việc thêm các số ngẫu nhiên sẽ thực sự làm cho nó ÍT NHẤT bằng chứng. Chỉ với dấu thời gian, hai số sẽ phải được tạo ở cùng một phần nghìn giây để giống nhau. Bằng cách cộng hai số ngẫu nhiên, giờ đây bạn đã tạo ra nhiều tổ hợp số, do toán học, có thể cho cùng một kết quả khi nhân lên. Tôi biết điều đó khó xảy ra, nhưng ... không phải vậy sao?
Phil

Hmm có. Có lẽ sự kết hợp giữa câu trả lời của Tôi và câu trả lời của abarber sẽ là tốt nhất.
Steven Vachon

Đã cập nhật câu trả lời của tôi. Cảm ơn vì những suy nghĩ.
Steven Vachon

2
Rất nỗ lực, không cố gắng chọn câu trả lời của bạn ... nhưng giải pháp mới này không thực sự giải quyết được vấn đề "nhiều hơn một id được tạo trong cùng một phần nghìn giây" bởi vì, bạn biết đấy .. đó là javascript, ở phía KHÁCH HÀNG. Nếu một người dùng khác đã tạo một số ở cùng một mili giây chính xác, nó sẽ không được phản ánh trong uniqueNumber. trước người dùng 'khác'. Trừ khi bạn lưu trữ nó trên máy chủ ở đâu đó và kiểm tra tính duy nhất ... không có cách nào mà một giải pháp hoàn toàn dựa trên js như thế này có thể chắc chắn rằng nó đang tạo ra một số duy nhất.
Phil

Chà, đó sẽ là một hệ thống phức tạp hơn chỉ là một con số duy nhất.
Steven Vachon

12

tôi sử dụng

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

Vì vậy, nếu ngẫu nhiên mã được kích hoạt đồng thời thì cũng có một cơ hội nhỏ là các số ngẫu nhiên sẽ giống nhau.


Không chắc chắn new Date()là hữu ích khó khăn. Bạn có thể nhận được những con số giống nhau với hai ngày khác nhau
JMaylin

1
Ý tôi là, làm thế nào nó tốt hơn là chỉ làm Math.random()?
JMaylin

7

Điều này nên làm:

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

1
Hữu ích cho nhiều trường hợp, nhưng điều này không thực sự tạo ra các id "duy nhất" thuần túy, trong trường hợp hàm này được gọi nhiều lần trong cùng một mili giây ... Nhưng dù sao, đối với tương tác giữa người dùng và giao diện người dùng, điều đó tốt.
Benjamin Piette

1
đây phải là câu trả lời được chấp nhận. Rất nhiều câu chuyện tào lao không liên quan, khó và không cần thiết, và câu trả lời này cung cấp thời gian duy nhất trên mỗi mili giây.
gen b.

5

nếu bạn muốn một số duy nhất sau vài mili giây thì hãy sử dụng Date.now(), nếu bạn muốn sử dụng nó trong một for loopthì hãy sử dụng Date.now() and Math.random()cùng nhau

số duy nhất bên trong vòng lặp for

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

đầu ra :: tất cả các số là duy nhất

15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316

số duy nhất không có Math.random()

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

đầu ra :: Các số được lặp lại

1559825328327 1559825328327 1559825328327 1559825328328 1559825328328


4

Từ việc điều tra trực tuyến, tôi đã tìm ra đối tượng sau để tạo một id duy nhất cho mỗi phiên:

        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 + '.');
            }
        }            
    }

Nó có thể hữu ích cho một số người.

Chúc mừng

Andrew


đây là giải pháp đơn giản nhất và bằng chứng lỗi cho đến nay về câu hỏi này. Tôi đã thử một giải pháp khác (xem bên dưới), nhưng tôi vẫn còn một số lo ngại về nó cần được phát triển thêm.
loretoparisi

3

Điều này cũng nên làm:

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

Cách thực hiện rất tương tự mà bạn có thể tìm thấy trong hàm UniqueId của lodash, đối với tôi, giải pháp của bạn rất đơn giản và sạch sẽ.
Kamil Naja

3

Trong 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('')

Thí dụ:

 > uniqueID()
 > "bxppcnanpuxzpyewttifptbklkurvvetigra"

2

Luôn nhận Id duy nhất trong JS

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

getUniqueId()    // Call the function

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

//"ka2high4264"

//"ka2hj115905"

//"ka2hj1my690"

//"ka2hj23j287"

//"ka2hj2jp869"

2

Vào năm 2020, bạn có thể sử dụng API Crypto trong trình duyệt để tạo các giá trị ngẫu nhiên mạnh về mặt mật mã.

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

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

cả Uint8ArrayCrypto.getRandomValues đều được hỗ trợ trên tất cả các trình duyệt chính, bao gồm IE11


1

Đăng đoạn mã này ở đây để tôi tham khảo trong tương lai (không được đảm bảo nhưng đủ "duy nhất" thỏa đáng):

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

Điều này tạo ra một phía máy khách khóa 32 ký tự duy nhất gần như được đảm bảo, nếu bạn muốn chỉ các số thay đổi var "ký tự".

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

sử dụng cái này: để tạo số duy nhất trong javascript

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

Nó thật sự có hiệu quả. :)


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

Gọi 1: UniqueValue ('0')
Gọi 2: UniqueValue (UniqueValue ('0')) // sẽ phức tạp

Output mẫu:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804


1

Vì mili giây không được cập nhật mỗi mili giây trong nút, sau đây là câu trả lời. Điều này tạo ra một số vé duy nhất mà con người có thể đọc được. Tôi chưa quen với lập trình và nodejs. Xin vui lòng sửa cho tôi nếu tôi sai.

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

Giả sử rằng giải pháp do @abarber đề xuất thì đó là một giải pháp tốt vì sử dụng (new Date()).getTime()nên nó có cửa sổ mili giây và tính tổngtick trong trường hợp có va chạm trong khoảng thời gian này, chúng tôi có thể cân nhắc sử dụng tích hợp sẵn vì chúng ta có thể thấy rõ ở đây:

Nắm tay, chúng ta có thể thấy ở đây cách có thể có va chạm trong khung cửa sổ 1/1000 bằng cách sử dụng (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

Thứ hai, chúng tôi thử giải pháp được đề xuất để tránh va chạm trong cửa sổ 1/1000:

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

Điều đó nói rằng chúng ta có thể xem xét sử dụng các chức năng như nút process.nextTickđược gọi trong vòng lặp sự kiện như một nút duy nhất tickvà nó được giải thích rõ ở đây . Tất nhiên trong trình duyệt không có process.nextTickvì vậy chúng tôi phải tìm cách làm điều đó. Đây thực hiện sẽ cài đặt một nextTickchức năng trong trình duyệt bằng cách sử dụng chức năng gần nhất để các I / O trong trình duyệt đó là setTimeout(fnc,0), setImmediate(fnc), window.requestAnimationFrame. Như đã đề xuất ở đây, chúng tôi có thể thêm window.postMessage, nhưng tôi để điều này cho người đọc vì nó cũng cần addEventListener. Tôi đã sửa đổi các phiên bản mô-đun ban đầu để đơn giản hơn ở đây:

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() )  
 })
})

Vì vậy, chúng tôi có trong cửa sổ 1/1000:

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

0

Thậm chí có thể tốt hơn là sử dụng getTime () hoặc valueOf (), nhưng theo cách này, nó trả về số duy nhất cộng với số dễ hiểu của con người (đại diện cho ngày và giờ):

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

Dễ dàng và luôn nhận được giá trị duy nhất:

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

0

Tôi đã làm theo cách này

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

tham khảo giải pháp #Marcelo Lazaroni ở trên

Date.now() + Math.random()

trả về một số chẳng hạn như 1567507511939.4558 này (giới hạn ở 4 số thập phân) và sẽ cung cấp các số không phải là duy nhất (hoặc va chạm) sau mỗi 0,1%.

thêm toString () sửa lỗi này

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

trả về '15675096840820.04510962122198503' (một chuỗi) và 'chậm' hơn nữa đến mức bạn không bao giờ nhận được mili giây 'giống nhau'.


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

kết quả mẫu "k3jobnvt_15750033412250_18299601769317408"


0

Sử dụng toString(36), hơi chậm, đây là giải pháp nhanh hơn và duy nhất:

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

0

Để nhận một số duy nhất:

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(""));
}

Thí dụ:

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

bạn có thể thay đổi độ dài bằng cách sử dụng:

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

Câu hỏi yêu cầu một số duy nhất , không phải một chuỗi ngẫu nhiên.
tshimkus

-1

Đảm bảo 100% tạo ra một số khác ...

var Q;
Q = {};
Q.timeInterval;

function genUniqueID(kol) {
	Q.timeInterval = setTimeout(function() {
		document.querySelector('#demo').innerHTML += new Date().valueOf() + '<br>';
		kol--;
		if (kol > 0) {
			genUniqueID(kol);
		}
	}, document.querySelector('#i2').value);
}
<div><input id="i1" type="number" value="5" style="width: 60px;"><label> - Amount</label><br>
    <input id="i2" type="number" value="10" style="width: 60px;"><label> - Millisecond interval</label></div><br>
<div>
    <button onclick="genUniqueID(document.querySelector('#i1').value);">Start</button>
    <button onclick="clearTimeout(Q.timeInterval);">Stop</button>
    <button onclick="document.querySelector('#demo').innerHTML = ''">Clear</button>
</div><br>
<div id="demo"></div>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.