當前位置:首頁 » 操作系統 » uuid演算法

uuid演算法

發布時間: 2022-08-18 11:49:37

㈠ 什麼是UUID,Java中怎麼產生UUID

UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫,是一種軟體建構的標准,亦為開放軟體基金會組織在分布式計算環境領域的一部分。其目的,是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。

生成UUID的方法:

public static String getUUID32(){ String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase(); return uuid;// return UUID.randomUUID().toString().replace("-", "").toLowerCase();}

註:因為一般資料庫主鍵為String類型,所以接收類型為String,生成的uuid數據包含-,所以要去掉-,故UUID.randomUUID().toString().replace("-", "").toLowerCase()。

(1)uuid演算法擴展閱讀

UUID由以下幾部分的組合:

(1)當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同。

(2)時鍾序列。

(3)全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。

UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標准使用最普遍的是微軟的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函數很簡單地生成UUID,其格式為:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)。

其中每個 x 是 0-9 或 a-f 范圍內的一個十六進制的數字。而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以從cflib 下載CreateGUID() UDF進行轉換。

㈡ GUID什麼意思

GUID(Globally Unique IDentifier) 也稱作 UUID(Universally Unique IDentifier).

特點:

GUID/UUID是通過特定演算法產生的一個二進制長度為128位的數字,

在空間上和時間上具有唯一性,保證同一時間不同地方產生的數字不同,

在公元3400年以前產生的UUID/GUID與任何其他產生過的UUIDs/GUIDs都不相同。

在需要GUID的時候,可以完全由演算法自動生成,不需要一個權威機構來管理。

GUID的長度固定,並且相對而言較短小,非常適合於排序、標識和存儲

用途:

標識特定的組件、程序、文件、數據、用戶等,並可以在網路中使用。

格式:
UUID 字元串格式可以由下面的EBNF語言來描述:

UUID = <time_low> "-" <time_mid> "-"
<time_high_and_version> "-"
<clock_seq_and_reserved>
<clock_seq_low> "-" <node>
time_low = 4*<hexOctet>
time_mid = 2*<hexOctet>
time_high_and_version = 2*<hexOctet>
clock_seq_and_reserved = <hexOctet>
clock_seq_low = <hexOctet>
node = 6*<hexOctet>
hexOctet = <hexDigit> <hexDigit>
hexDigit =
"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
| "a" | "b" | "c" | "d" | "e" | "f"
| "A" | "B" | "C" | "D" | "E" | "F"

例如:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

演算法:

GUID的演算法並不唯一,可以由多種方法來生成。

GUID生成器除了標識不同的時間,還要唯一地標識不同的地點,這可以使用網卡的48位的IEEE 802地址。

GUID的128位可以分為16個位元組,前8個位元組是時間和版本號,中間2個位元組是UUID變體和時鍾序數,後6個位元組標識地點。

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

UUID變體位於第9個位元組的前3位,有4種定義:

Msb0 Msb1 Msb2 Description

0 - - Reserved, NCS backward compatibility.

1 0 - The variant specified in this document.

1 1 0 Reserved, Microsoft Corporation backward
compatibility

1 1 1 Reserved for future definition.

版本號位於第7個位元組的前4位:

Msb0 Msb1 Msb2 Msb3 Version Description

0 0 0 1 1 The time-based version
specified in this
document.

0 0 1 0 2 Reserved for DCE
Security version, with
embedded POSIX UIDs.

0 0 1 1 3 The name-based version
specified in this
document

0 1 0 0 4 The randomly or pseudo-
randomly generated
version specified in
this document

時間的標識(Timestamp)

UUID version 1, UTC時間從 00:00:00.00, 15 October 1582開始以100納秒的計數.
沒有UTC時間時,也可以使用當地時間,只要在系統中保持一貫就行,這並不推薦,
當地時間與UTC時間只是一個時差的問題。
UTC - Coordinated Universal Time

UUID version 3, 由名字空間產生一個60位數.

UUID version 4, 隨機地或偽隨機地產生一個60位數.

時鍾序數 Clock sequence

UUID version 1, 時鍾序數用來避免鍾表被調慢後產生重復。比如網卡移到別的機器上,或者斷電等。
如果先前的時鍾序數已知,加1即可,否則隨機產生,更換隨機數種子以減小重復的可能性。

UUID version 3, 由名字空間產生一個14位數.

地點的標識(node)

UUID version 1, 採用主機的IEEE 地址,系統有多個IEEE 802地址時,任取一個;

沒有IEEE地址時,使隨機數或偽隨機數並保證與網卡上地址不同(見 section 4).

UUID version 3, 由名字空間產生一個48位數.

UUID version 4, 隨機地或偽隨機地產生一個48位數.

參考文獻:
http://www.ics.uci.e/~ejw/authoring/uuid-guid/draft-leach-uuids-guids-01.txt

㈢ hibernate中,定義主鍵id的 generator的class="uuid" 那麼這個Id是不是自動增加

首先要知道它的生成原理:
UUID演算法使用IP地址、JVM的啟動時間、系統時間和一個計數值來產生主鍵。
同時包括兩種方式實現:
uuid.hex由Hibernate基於128
位唯一值產生演算法生成16
進制數值(編碼後以長度32
的字元串表示)作為主鍵。
uuid.string與uuid.hex
類似,只是生成的主鍵未進行編碼(長度16)。在某些資料庫中可能出現問題(如Postgresql)。
所以呢。。。它每次生成的值不相同的。。。而且生成的結果是字元串形式的。。。故不是自動增長的。。。
自動增長用於數值類型的資料庫作為主鍵的形式。

㈣ js中如何產生uuid

http://www.broofa.com/Tools/Math.uuid.js

Math.uuid = (function() {

// Private array of chars to use

var CHARS = ''.split('');

return function (len, radix) {

var chars = CHARS, uuid = [], rnd = Math.random;

radix = radix || chars.length;

if (len) {

// Compact form

for (var i = 0; i < len; i++) uuid[i] = chars[0 | rnd()*radix];

} else {

// rfc4122, version 4 form

var r;

// rfc4122 requires these characters

uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';

uuid[14] = '4';

// Fill in random data. At i==19 set the high bits of clock sequence as

// per rfc4122, sec. 4.1.5

for (var i = 0; i < 36; i++) {

if (!uuid[i]) {

r = 0 | rnd()*16;

uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];

}

}

}

return uuid.join('');

};

})();

// Deprecated - only here for backward compatability

var randomUUID = Math.uuid;

function generateUUID()

{

return Math.uuid();

}

㈤ 關於UDID和UUID的區別

UDID和UUID的區別如下:

一、定義的不同:

所謂UDID指的是設備的唯一設備識別符,移動廣告商和游戲網路運營商往往需要通過UDID用來識別玩家用戶,並對用戶活動進行跟蹤。。而UUID 是通用唯一識別碼,是一種軟體建構的標准,亦為開放軟體基金會組織在分布式計算環境領域的一部分。其目的,是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。

二、用途不同:

UDID用於一些統計與分析目的、將UDID作為用戶ID來唯一識別用戶,省去用戶名,密碼等注冊過程。而UUID 的目的是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人沖突的 UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重復問題。


(5)uuid演算法擴展閱讀:

基於時間的UUID通過計算當前時間戳、隨機數和機器MAC地址得到。由於在演算法中使用了MAC地址,這個版本的UUID可以保證在全球范圍的唯一性。但與此同時,使用MAC地址會帶來安全性問題,這就是這個版本UUID受到批評的地方。如果應用只是在區域網中使用,也可以使用退化的演算法,以IP地址來代替MAC地址--Java的UUID往往是這樣實現的。

通用唯一標識符還可以用來指向大多數的可能的物體。微軟和其他一些軟體公司都傾向使用全球唯一標識符(GUID),這也是通用唯一標識符的一種類型,可用來指向組建對象模塊對象和其他的軟體組件。第一個通用唯一標識符是在網路計算機系統(NCS)中創建,並且隨後成為開放軟體基金會(OSF)的分布式計算環境(DCE)的組件。

㈥ mysql裡面什麼是uuid

首先,在mysql里建議不要用非自增id做主鍵,不然插入速度很慢,除非是查詢為主的表。uuid主要解決的是分布式生成唯一編號的問題,不一定非要用現有的uuid方法

㈦ PostgreSQL中使用UUID

UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一個 128 比特的數字,可以用於唯一標識每個網路對象或資源。由於它的生成機制,一個 UUID 可以保證幾乎不會與其他 UUID 重復,因此常常用於生成資料庫中的主鍵值。

1.pgcrypto 模塊提供的 uuid

PostgreSQL 提供了一個用於加/解密的擴展模塊 pgcrypto,其中的 gen_random_uuid() 函數可以用於返回一個 version 4 的隨機 UUID。

2.uuid-ossp 模塊提供的 uuid

uuid-ossp模塊提供函數使用幾種標准演算法之一產生通用唯一標識符(UUID)。還提供產生某些特殊 UUID 常量的函數。

1.將當前目錄轉移到 PostgreSQL 源代碼目錄下的 contrib;如:

2.執行如下命令來安裝擴展模塊

如果要安裝 uuid-ossp 模塊,需要在執行安裝擴展模塊之前,執行 configure 並添加 --with-uuid=xxx,xxx取值為:

然後再執行安裝擴展模塊的命令。

3.檢查是否安裝,在 PostgreSQL 的安裝目錄下的 /share/extension 目錄下,查看是否有模塊相關的文件。如:

註: gen_random_uuid() 從 PostgreSQL 13 開始成為了一個內置函數

如果您所使用的PostgreSQL版本在13以上,則不需要執行如下語句:

生成uuid:

如果想要生成沒有中劃線(-)的 UUID 字元串,可以使用 REPLACE 函數:

查看包含的函數:

執行如下命令生成 uuid:



㈧ 如何選擇主鍵uuid

以前對UUID的了解很少,只知道是128位整數(16位元組)的全局唯一標識符(Universally Unique Identifier)。
剛才google了下,算是有了點深入的了解。

UUID是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平台會提供生成UUID的API。UUID按照開放軟體基金會(OSF)制定的標准計算,用到了乙太網卡地址、納秒級時間、晶元ID碼和許多可能的數字。由以下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同),時鍾序列,全局唯一的IEEE機器識別號(如果有網卡,從網卡獲得,沒有網卡以其他方式獲得),UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標准使用最普遍的是微軟的GUID(Globals Unique Identifiers)。

使用UUID的好處在分布式的軟體系統中(比如:DCE/RPC, COM+,CORBA)就能體現出來,它能保證每個節點所生成的標識都不會重復,並且隨著WEB服務等整合技術的發展,UUID的優勢將更加明顯。

我唯一還算熟悉的資料庫就算是MySQL了,大概使用MySQL的人,百分之九九以上的人會使用Autoincrement ID做主鍵,這是可以理解的,因為MySQL的自增ID效率很高,使用也很方便。那麼剩下的百分之一的人使用什麼做主鍵呢?可能是自己做的KeyGenerator,也可能是我們下面要說的UUID。

據說在Oracle的圈子裡,如果誰用自增ID做主鍵是要被鄙視的,主鍵最自然的選擇就是UUID。我不了解Oracle,這些道聽途說的結論是否正確不做承諾。

那麼我們先看看什麼是UUID?簡單的說,UUID是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。在UUID的演算法中,可能會用到諸如網卡MAC地址,IP,主機名,進程ID等信息以保證其獨立性。

如果你的MySQL版本不太老的話,鍵入 SELECT UUID(); 輸出的就是UUID,如下:

mysql> select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+

現在大家應該對UUID有一個比較直觀的認識了,我們來看看UUID的優缺點分別是什麼。

優點:

能夠保證獨立性,程序可以在不同的資料庫間遷移,效果不受影響。
保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分資料庫的時候尤為重要。

缺點:

比較佔地方,和INT類型相比,存儲一個UUID要花費更多的空間。
使用UUID後,URL顯得冗長,不夠友好。

下面針對上述UUID的缺點說說我的看法,比較佔地方這個缺點我不是很在乎,現在最不值錢的就是硬碟了,略過此條缺點無妨,但需要注意的一點數據在索引的時候效率會隨著體積的增加而降低。至於說使用UUID後,URL顯得不友好,我覺得這多少是你的INT情結造成的慣性思維,其實,和INT類型相比,UUID才是最自然的主鍵選擇,注意,我這里用的是自然這個形容詞,仔細體會一下你能理解我的意思。另外,很多時候,URL本身就不需要友好,比如,一個電子商務網站,按照INT友好的URL說法,她的訂單URL大概是下面這個形式的:/order.php/id/123,我要說明的是,這樣是很友好,但是有些太友好了,友好的甚至不安全,比如說,我早晨下一個訂單,發現URL是/order.php/id/1000,晚上再下一個訂單發現URL是/order.php/id/2000,那麼我就可以估計出此網站一天的訂單數大致是1000左右,甚至能大體估計出它的銷售額,而這些數據往往都是重要的商業秘密。使用UUID就沒有這個顧慮。

效率?

如果上面說的UUID的所謂缺點都不成立的話,那麼是否使用UUID做主鍵,唯一的問題就是效率了。據說在PostgreSQL等資料庫里,都有專門的UUID類型,在這樣的資料庫里,使用UUID做主鍵,效率沒有任何問題,可惜在MySQL里沒有這樣的欄位,如果想在MySQL里保存UUID做主鍵,一般是使用CHAR(36)來模擬,因為不是一個原生的UUID類型,所以主鍵的效率到底如何有待測試,另外,UUID做主鍵的效率和UUID本身的演算法實現也有很大關系。

另外,對於InnoDB這種聚集主鍵類型的引擎來說,數據會按照主鍵進行排序,由於UUID的無序性,InnoDB會產生巨大的IO壓力,此時不適合使用UUID做物理主鍵,可以把它作為邏輯主鍵,物理主鍵依然使用自增ID。

我本來想在我自己的電腦上插入1000000條數據測試一下看看來著,可惜一測試,硬碟燈就一直亮,讓我很擔心它會掛,雖然硬碟不值錢,但是我重要的數據都在上面,一旦壞了,損失就大了,所以,測試只好作罷。

熱點內容
阿里雲esc伺服器系統 發布:2025-01-18 09:49:16 瀏覽:789
你們家的無線網密碼是多少 發布:2025-01-18 09:47:50 瀏覽:729
renderscriptandroid 發布:2025-01-18 09:32:18 瀏覽:992
安卓手機如何拍游戲素材 發布:2025-01-18 09:30:59 瀏覽:347
廣州日立壓縮機有限公司 發布:2025-01-18 09:15:08 瀏覽:623
伺服器兩條寬頻如何疊加網速 發布:2025-01-18 08:52:17 瀏覽:730
oracle存儲過程集合 發布:2025-01-18 08:42:39 瀏覽:884
洋蔥數學緩存 發布:2025-01-18 08:38:36 瀏覽:918
電影的文件夾都是 發布:2025-01-18 08:21:49 瀏覽:835
post提交php 發布:2025-01-18 08:21:42 瀏覽:460