一、基本概念
UUID,即通用唯一標識符(Universally Unique Identifier),是由一組十六進制數字組成的標識符,可以用來在分布式系統(tǒng)中唯一地標識某個信息。UUID是一種用于多個計算機之間的唯一標識符,用于指示文件或數據庫內的唯一對象。
/** * 生成UUID */ public static String generateUUID() { return UUID.randomUUID().toString().replace("-", ""); }
雪花算法,即Snowflake算法,是一種生成ID的算法,它可以保證在分布式系統(tǒng)中生成ID是唯一的。Snowflake算法的核心是一個64位的二進制數字,由以下三部分組成:
1、時間戳(42位):毫秒級時間戳,從開始使用此算法的時間點開始算起,在遞增中產生,最大可用69年;
2、機器標識(10位):可以指定每個節(jié)點的ID從0-1023進行編號;
3、序列號(12位):同一毫秒級時間戳下,不同機器的序列號會依次遞增,最多可以生成4096個ID。
/** * 雪花算法 * * @param dataCenterId 數據中心ID * @param workerId 工作機器ID * @return 分布式ID */ public long snowFlake(long dataCenterId, long workerId) { long timestamp = System.currentTimeMillis(); // 時間戳部分 long timeBits = timestamp - SNOW_FLAKE_EPOCH; // 數據中心ID部分 long dataCenterIdBits = dataCenterId << SNOW_FLAKE_DATACENTER_ID_SHIFT; // 工作機器ID部分 long workerIdBits = workerId << SNOW_FLAKE_WORKER_ID_SHIFT; // 組裝分布式ID return timeBits | dataCenterIdBits | workerIdBits | sequence; }
二、唯一性
UUID的唯一性基于產生隨機性的偽隨機數生成器,因此生成的UUID是幾乎不可能重復的,但也不能完全避免重復。
相比之下,雪花算法的唯一性更可靠,因為它對時間戳、數據中心ID、工作機器ID和序列號進行了組合,可以確保在不同時間戳下不同數據中心、不同工作機器之間產生的ID絕對唯一。但也要注意,如果當前工作機器ID生成的序列號達到了上限,就會有重復ID的風險。
三、性能
UUID的生成速度相對較快,建議在需要使用anonymize identifier時使用。但是,由于UUID的長度比較長(128位),在使用時需要花費更多的磁盤空間和網絡帶寬。
雪花算法的生成速度也比較快,但要求系統(tǒng)時鐘準確無誤,否則就會有ID重復的問題。此外,在分布式系統(tǒng)中使用時,需要考慮數據中心ID和工作機器ID的分配問題,避免重復。
四、適用場景
UUID可以在多個分布式系統(tǒng)中保持唯一性,因此廣泛應用于匿名或無需長期存儲的系統(tǒng),如會話標識符、Cookie ID和游戲中的臨時ID等。
雪花算法適用于分布式系統(tǒng)中的唯一ID生成,可用于唯一訂單號、會員ID和設備ID等。但是,在多個數據中心之間運行時,需要根據數據中心ID和工作機器ID通過算法配置進行規(guī)劃,否則就會產生ID沖突。