演算法 位運算ObjectId生成時的秒用

2022-02-18 07:16:17 字數 1581 閱讀 8699

通過位運算,可以對乙個數進行限制,保證這個數在2n-1(3,7,15,31,63,127,255...)範圍內,當大於指定的數時,會取這個0到2n-1裡的某個數,不會讓它溢位。

objectid最早在mongodb的分布式環境出現,用來生成主鍵,因為mongodb是乙個集群的,分布式的,所以要求它的主鍵的要求更高;它主要使用乙個12個位元組進行儲存,而我們知道每1個位元組對應8位二進位制數,而每4二進位制數對應1個16進製制數,所以12個位元組用16進製表示,就是24個16進製制字元組成。

在使用&與運算時,我們知道它對2^-1有乙個定理,16進製制就是f,ff,fff,ffff,fffff....這些,它對應的二進位制是由n個1組成的,它與其它數字進行與時就有一些特性(全1為1,有0則0),通過這個特性,我們可以限定乙個數字範圍。

@test

public void bitoperator() ", 10 & 7);

log.info("3 & 7={}", 3 & 7);

log.info("10 & 255={}", 10 & 255);

log.info("300 & 255={}", 300 & 255); //255的16進製為ff,後面數字為2^n-1

}

結果

從圖中可以看出,10 & 7中,10大於後面的7,由於使用了&運算,保證了結果在0~7之間;而3 & 7,由於3小於7,所以結果就是3本身。

10對應的二進位制1010

7 對應的二進位制111

現在進行與運算

1010

&0111

結果 0010

對應10進行是2,由於7是111組成,而10是1010,當位數不同時,需要為111補0,它就變成了0111,這時,高位由於是0,所以不論你的數有多大,結果都是0,最後也就是0到7之間的某個數了,至於是哪個數,這和你的原數有關,原數高位都是0,低位數字不變。

對於或運算,也有它的使用場景,我們以二進位制說明,比如0x1000這個數(十進位制是4096),其它數與它進行或運算,得到的結果將是從4096開始的數字,如果1 | 4096,結果將是4097,以此類推,不過有一點要注意,你的數字在4096範圍內,它產生與4096作或運算,產生新的數字是不會重複的;但如果你的數字大於4096,比如4097|4096,它的結果將還是4097,這點需要注意。

如果我們確定了數字範圍,可以利用這個性質,在乙個較大的數字基礎上,去產生新的數字。

begin = long.parselong("1000", 16);

for (int i = 0; i < 10; i++) | {} = {}", i, begin, i | begin);//超過begin之後,數字會有重複

}

結果

演算法 位運算

public static intpowern int m,int n return m public static void main string args public static boolean ispower int n return false num如何使2的n次冪,那麼num nu...

MongoDB中ObjectId生成規則參考

mongodb中我們經常會接觸到乙個自動生成的字段 id 型別為objectid。本文會詳解objectid的構成和使用。objectid構成 之前我們使用mysql等關係型資料庫時,主鍵都是設定成自增的。但在分布式環境下,這種方法就不可行了,會產生衝突。為此,mongodb採用了乙個稱之為obje...

C 生成 MongoDB 中的 ObjectId

在mongodb中,文件 document 在集合 collection 中的儲存需要乙個唯一的 id欄位作為主鍵。這個 id預設使用objectid來定義,因為objectid定義的足夠短小,並盡最大可能的保持唯一性,同時能被快速的生成。objectid 是乙個 12 bytes 的 bson 型...