簡體   English   中英

在JavaScript或打字稿中生成唯一的隨機數

[英]Generate unique random numbers in javascript or typescript

我需要在javascript(或Typescript)中獲得唯一的隨機數。

現在,我使用以下代碼:

var id = -((new Date()).getTime() & 0xffff);

它會返回-13915-28806類的數字...

它在大多數情況下都有效,但是在按承諾執行此代碼時(同時幾乎多次),我遇到了問題。 然后有時候我得到兩個相同的ID。

有什么辦法在任何情況下都能獲得唯一的隨機數嗎?

互聯網周圍有很多例子。 您可以從使用Math.random() 例如:生成1到100之間的隨機數

Math.floor((Math.random() * 100) + 1);

請記住,它並不是真正隨機的。 它不是加密安全的 如果需要,您可能應該研究圖書館

var datetimestamp = Date.now()+ Math.random()。toString(36).substr(2,9);

創建一個返回唯一數字的函數:

let numbers = [];

const uniqueNumber = (maxVal) => {
   const number = Math.floor((Math.random() * maxVal) + 1);
   if (!numbers.includes(number)) {
      numbers.push(number);
      return number;
   } else if (numbers.length - 1 !== maxVal) {
      uniqueNumber(maxVal);
   }
}

const randomNumber = uniqueNumber(100);
console.log(numbers) // returns all unique numbers

這將返回介於1到100之間的不定數。它也將以最大長度停止。

  1. Math.random()本身應該足夠安全,對於64位數字而言。 即使使用不完善的生成器,兩次擊中相同數字的機會也很小。

  2. 如果您要使用特定的整數,則將Math.random()乘以BIG,例如Number.MAX_SAFE_INTEGER

  3. 為完全安全起見,您始終可以存儲一個已經使用過的id的數組,並編寫一個繪制函數,直到獲得新的唯一數字,然后將其壓入數組並返回值。 將所有功能封裝在單個對象/功能/類中,以保持其整潔。

您可以使用軟件包uuid

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'

注意:這是一個數字(128位數字),但是太大而無法用作JavaScript數字。 您必須將其保留為字符串。

如果您在瀏覽器上需要它,我建議從后端公開的API生成標識符。 UUID的實現以大多數語言存在。 npm軟件包將在瀏覽器上運行,但隨后會使用Math.random的后備版本 ,這是不安全的。

另請參閱: 通用唯一標識符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM