簡體   English   中英

如何一般性地解決在JavaScript中生成增量整數ID的問題

[英]How to generically solve the problem of generating incremental integer IDs in JavaScript

我已經考慮了幾天,試圖看看是否有通用的方法來編寫此函數,這樣您就不必擔心它會再次中斷。 也就是說,它具有盡可能強大的功能,並且可以支持有效地(在JavaScript中)用完所有內存。

所以問題是關於基本的事情。 通常,當您使用某種類型的JavaScript創建對象時,可能會給它們提供一個ID。 在瀏覽器中(例如,帶有虛擬DOM元素),您可以為它們提供一個全局唯一ID(GUID),並將其設置為遞增整數。

GUID = 1

let a = createNode() // { id: 1 }
let b = createNode() // { id: 2 }
let c = createNode() // { id: 3 }

function createNode() {
  return { id: GUID++ }
}

但是,如果用盡整數會發生什么? Number.MAX_SAFE_INTEGER == 2⁵³ - 1 顯然,這是一個非常大的數目:也許是9,007,199,254,740,991萬億次。 數十億億。 但是,如果JS可以達到每秒一千萬次操作的速度,那么達到這個數字大約需要900,719,925s ,或者10416天,或者大約30年。 因此,在這種情況下,如果您讓計算機運行30年,則最終ID會用完。 這將是很難找到的錯誤!!!

如果並行化ID的生成,則可以更現實(更快)地用完遞增的整數。 假設您不想使用GUID方案。

給定計算機的內存限制,您只能創建一定數量的對象。 在JS中,您創建的數量可能不會超過幾十億。

但是我的問題是,從理論上講,您如何解決生成增量整數的問題,以至於如果達到Number.MAX_SAFE_INTEGER ,您將從頭開始循環,而不會使用潛在的數十億(或數百萬) ),您已經具有“生存和約束力”。 您必須使用哪種方案才能使它循環訪問整數並始終知道您有可用的免費方案?

function getNextID() {
  if (i++ > Number.MAX_SAFE_INTEGER) {
    return i = 0
  } else {
    return i
  }
}

隨機注釋

整體上最快的是Chrome 11(每十億次迭代不足2秒,或者每次迭代最多4個CPU周期); 最慢的是IE8(每十億次迭代約55秒,或每次迭代超過100個CPU周期)。


基本上,此問題源於以下事實:我們的典型“實用”解決方案會在進入Number.MAX_SAFE_INTEGER的超邊緣情況下Number.MAX_SAFE_INTEGER ,這很難測試。 我想知道一些解決問題的方法,而不僅僅是以某種方式犯錯。

但是,如果用盡整數會發生什么?

你不會的 曾經

但是,如果JS可以達到每秒1000萬次操作,則大約需要30年。

補充不多。 30年來,沒有計算機可以在同一程序上運行。 同樣在這個非常人為的示例中, 您僅生成id 在實際計算中,您可能會花費1/10000的時間來生成ID,因此30年變成300000年。

您如何解決生成增量整數的問題,以便如果達到Number.MAX_SAFE_INTEGER,則從頭開始循環返回,

如果您“從頭開始循環”,它們將不再“遞增”。 您的要求之一無法滿足。

如果並行化ID的生成,則可以更現實(更快)地用完遞增的整數。

否。為使ID嚴格遞增,您必須在這些並行化代理之間共享一個計數器。 而且只有通過同步才可以訪問共享內存,因此根本不會更快。

如果您仍然真的認為自己將用完52bit,請使用BigInts。 或符號,取決於您的用例。

暫無
暫無

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

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