<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
雪花演演算法是在一個專案體系中生成全域性唯一ID標識的一種方式,偶然間看到了Python使用雪花演演算法不盡感嘆真的是太便捷了。
它生成的唯一ID的規則也是通過常用的時間戳來統計的,但是計算方式卻更為精準。除此之外,再配合上不同機器屬性分散式的使用就可以使生成的ID在整個單擊或是分散式專案保持唯一性。
雪花演演算法通過時間規則,以二進位制的方式將進行時間戳以及機器屬性等資訊的填充,所以生成後的唯一ID是按照時間遞增的規律來排列的。為了形成對比,下面先看看在Java開發中的雪花演演算法是如何生成唯一ID的。
package utils; public class Snowflake { /** 開始時間截 (2015-01-01) */ private final long twepoch = 1420041600000L; /** 機器id所佔的位數 */ private final long workerIdBits = 5L; /** 資料標識id所佔的位數 */ private final long datacenterIdBits = 5L; /** 支援的最大機器id,結果是31 (這個移位演演算法可以很快的計算出幾位二進位制數所能表示的最大十進位制數) */ private final long maxWorkerId = -1L ^ (-1L << workerIdBits); /** 支援的最巨量資料標識id,結果是31 */ private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); /** 序列在id中佔的位數 */ private final long sequenceBits = 12L; /** 機器ID向左移12位元 */ private final long workerIdShift = sequenceBits; /** 資料標識id向左移17位(12+5) */ private final long datacenterIdShift = sequenceBits + workerIdBits; /** 時間截向左移22位(5+5+12) */ private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; /** 生成序列的掩碼,這裡為4095 (0b111111111111=0xfff=4095) */ private final long sequenceMask = -1L ^ (-1L << sequenceBits); /** 工作機器ID(0~31) */ private long workerId; /** 資料中心ID(0~31) */ private long datacenterId; /** 毫秒內序列(0~4095) */ private long sequence = 0L; /** 上次生成ID的時間截 */ private long lastTimestamp = -1L; public Snowflake(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } public synchronized long nextId() { long timestamp = timeGen(); //如果當前時間小於上一次ID生成的時間戳,說明系統時鐘回退過這個時候應當丟擲異常 if (timestamp < lastTimestamp) { throw new RuntimeException( String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } //如果是同一時間生成的,則進行毫秒內序列 if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; //毫秒內序列溢位 if (sequence == 0) { //阻塞到下一個毫秒,獲得新的時間戳 timestamp = tilNextMillis(lastTimestamp); } } //時間戳改變,毫秒內序列重置 else { sequence = 0L; } //上次生成ID的時間截 lastTimestamp = timestamp; //移位並通過或運算拼到一起組成64位元的ID return ((timestamp - twepoch) << timestampLeftShift) // | (datacenterId << datacenterIdShift) // | (workerId << workerIdShift) // | sequence; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { Snowflake idWorker = new Snowflake(0, 0); for (int i = 0; i < 100; i++) { long id = idWorker.nextId(); System.out.println(Long.toBinaryString(id)); System.out.println(id); } } }
通過上述的Java程式碼塊就能生成100個唯一的ID,並且在Java程式碼塊中定義生成ID時各種屬性資訊,大概有100行程式碼左右,我擷取了生成唯一ID的部分結果來展示。
111001000000000011001001011001011010110000000000000000010111
1026834554947633175
111001000000000011001001011001011010110000000000000000011000
1026834554947633176
111001000000000011001001011001011011000000000000000000000000
1026834554951827456
111001000000000011001001011001011011000000000000000000000001
1026834554951827457
這樣的程式碼塊可能使用C++的方式實現的話過程可能更為複雜,相比之下Python開發的話比較簡單,因為大佬們已經將一些複雜的東西都寫好了,我們經常只需要直接呼叫即可,這裡說明一下不同程式語言都是我們做業務的一種工具,都有自己誕生的使命。
接下來,我們使用python呼叫第三方模組的方式來實現雪花演演算法,具體使用python實現雪花演演算法生成唯一ID的思路肯定和Java也是相似的。
在python中,大佬們已經封裝了pysnowflake的python非標準庫,這也是python之所以方便的原因,通過pip的方式將其安裝完成就能大顯身手了。
pip install pysnowflake -i https://pypi.tuna.tsinghua.edu.cn/simple/
安裝完成之後需要啟動雪花演演算法生成唯一ID的服務,並且可以定義工作的數量,這裡我們將工作數量定義為1啟動服務。
將snowflake.client匯入到程式碼塊中,相當於我們作為使用者端去存取伺服器端就會直接生成唯一ID。
# Importing the `snowflake.client` module. import snowflake.client # Calling the `get_guid()` function from the `snowflake.client` module. uuid = snowflake.client.get_guid() # Printing the value of the `uuid` variable. print(uuid) # Printing the binary representation of the `uuid` variable. print(bin(uuid)) # 4674877370191056897 # 0b100000011100000100000000011001100011010110000000001000000000001
到此這篇關於Python利用雪花演演算法實現生成唯一ID的文章就介紹到這了,更多相關Python雪花演演算法生成唯一ID內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45