日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

生成不唯一的编号

發(fā)布時(shí)間:2024/9/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生成不唯一的编号 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
package utils;import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface;/*** <p>名稱:IdWorker.java</p>* <p>描述:分布式自增長(zhǎng)ID</p>* <pre>* Twitter的 Snowflake JAVA實(shí)現(xiàn)方案* </pre>* 核心代碼為其IdWorker這個(gè)類實(shí)現(xiàn),其原理結(jié)構(gòu)如下,我分別用一個(gè)0表示一位,用—分割開部分的作用:* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000* 在上面的字符串中,第一位為未使用(實(shí)際上也可作為long的符號(hào)位),接下來(lái)的41位為毫秒級(jí)時(shí)間,* 然后5位datacenter標(biāo)識(shí)位,5位機(jī)器ID(并不算標(biāo)識(shí)符,實(shí)際是為線程標(biāo)識(shí)),* 然后12位該毫秒內(nèi)的當(dāng)前毫秒內(nèi)的計(jì)數(shù),加起來(lái)剛好64位,為一個(gè)Long型。* 這樣的好處是,整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生ID碰撞(由datacenter和機(jī)器ID作區(qū)分),* 并且效率較高,經(jīng)測(cè)試,snowflake每秒能夠產(chǎn)生26萬(wàn)ID左右,完全滿足需要。* <p>* 64位ID (42(毫秒)+5(機(jī)器ID)+5(業(yè)務(wù)編碼)+12(重復(fù)累加))** @author Polim*/ public class IdWorker {// 時(shí)間起始標(biāo)記點(diǎn),作為基準(zhǔn),一般取系統(tǒng)的最近時(shí)間(一旦確定不能變動(dòng))private final static long twepoch = 1288834974657L;// 機(jī)器標(biāo)識(shí)位數(shù)private final static long workerIdBits = 5L;// 數(shù)據(jù)中心標(biāo)識(shí)位數(shù)private final static long datacenterIdBits = 5L;// 機(jī)器ID最大值private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);// 數(shù)據(jù)中心ID最大值private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);// 毫秒內(nèi)自增位private final static long sequenceBits = 12L;// 機(jī)器ID偏左移12位private final static long workerIdShift = sequenceBits;// 數(shù)據(jù)中心ID左移17位private final static long datacenterIdShift = sequenceBits + workerIdBits;// 時(shí)間毫秒左移22位private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final static long sequenceMask = -1L ^ (-1L << sequenceBits);/* 上次生產(chǎn)id時(shí)間戳 */private static long lastTimestamp = -1L;// 0,并發(fā)控制private long sequence = 0L;private final long workerId;// 數(shù)據(jù)標(biāo)識(shí)id部分private final long datacenterId;public IdWorker(){this.datacenterId = getDatacenterId(maxDatacenterId);this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);}/*** @param workerId* 工作機(jī)器ID* @param datacenterId* 序列號(hào)*/public IdWorker(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;}/*** 獲取下一個(gè)ID** @return*/public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {// 當(dāng)前毫秒內(nèi),則+1sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {// 當(dāng)前毫秒內(nèi)計(jì)數(shù)滿了,則等待下一秒timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;// ID偏移組合生成最終的ID,并返回IDlong nextId = ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence;return nextId;}private long tilNextMillis(final long lastTimestamp) {long timestamp = this.timeGen();while (timestamp <= lastTimestamp) {timestamp = this.timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}/*** <p>* 獲取 maxWorkerId* </p>*/protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {StringBuffer mpid = new StringBuffer();mpid.append(datacenterId);String name = ManagementFactory.getRuntimeMXBean().getName();if (!name.isEmpty()) {/** GET jvmPid*/mpid.append(name.split("@")[0]);}/** MAC + PID 的 hashcode 獲取16個(gè)低位*/return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);}/*** <p>* 數(shù)據(jù)標(biāo)識(shí)id部分* </p>*/protected static long getDatacenterId(long maxDatacenterId) {long id = 0L;try {InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);if (network == null) {id = 1L;} else {byte[] mac = network.getHardwareAddress();id = ((0x000000FF & (long) mac[mac.length - 1])| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;id = id % (maxDatacenterId + 1);}} catch (Exception e) {System.out.println(" getDatacenterId: " + e.getMessage());}return id;}} 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的生成不唯一的编号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品国产一区在线观看 | 日韩中文字幕视频在线观看 | 国产女同视频 | 欧美日韩亚洲另类 | 欧美日韩成人在线观看 | 日本福利一区二区 | 成人国产一区 | 爱爱综合 | 国产又色又爽又黄又免费 | 亚洲人成人无码网www国产 | 欧美日韩一区二区三区在线播放 | 在线播放黄色网址 | 亚洲欧美精品午睡沙发 | 欧美人吸奶水吃奶水 | 午夜黄色网址 | 卡通动漫亚洲综合 | 久久精品国产视频 | 亚洲精品中文字幕成人片 | 国产一区二区不卡视频 | 天堂色在线 | 日韩视频免费在线观看 | 国内爆初菊对白视频 | 影音先锋成人资源网站 | 一级美女视频 | 成人性生活毛片 | 在线v| 青青青青青青青青草 | 苍井空浴缸大战猛男120分钟 | 久久国产精品视频 | 国产a级淫片 | 国产精品一区一区三区 | a级片网址 | 在线观看成人网 | www.男人的天堂 | 香蕉av在线播放 | 日韩亚洲影院 | xxxxxxxx黄色片 | 热九九精品| 色综合免费视频 | h视频在线免费观看 | 天天燥日日燥 | 日本不卡中文字幕 | 女人天堂网 | 色婷婷aⅴ一区二区三区 | 三浦惠理子aⅴ一二三区 | 产乳奶汁h文1v1 | 亚洲一区精品视频在线观看 | 中国少妇毛片 | www.com污| 亚洲成av人在线观看 | 天堂网2014| 在线观看色视频 | 男女插插插视频 | 疯狂做爰的爽文多肉小说王爷 | 夜夜爽av福利精品导航 | 免费看日韩av | 国产精品麻豆视频 | 十大污网站 | 日韩欧美在线视频免费观看 | 欧美在线资源 | 双性娇喘浑圆奶水h男男漫画 | 亚洲精品图区 | 久久黄色免费网站 | 在线播放国产精品 | 中文字幕一区二区在线观看 | 肥臀熟女一区二区三区 | 日韩特级片 | 青青草视频播放器 | 久久婷婷国产 | 娇妻之欲海泛舟无弹窗笔趣阁 | 国产日韩在线观看视频 | 美女主播在线观看 | 国产欧美一区二区三区国产幕精品 | 欧美日本韩国一区二区三区 | 91在线观看免费高清 | 亚洲第一天堂影院 | 日韩影院一区 | 大尺度做爰呻吟舌吻网站 | 黄色网视频 | 国产精品高潮呻吟久久 | 少妇精品一区二区 | 农村老熟妇乱子伦视频 | 网友自拍第一页 | www.色播.com | 二三区视频 | 亚洲大片在线观看 | 久久久久久夜 | 亚洲国产成人精品一区二区三区 | 久久成人在线 | 亚洲麻豆一区 | 精品视频91| 中文字幕在线免费播放 | 亚洲人人精品 | 青青艹av | 黑丝扣逼| 91精品视频免费看 | 偷偷操99| 久久成人黄色 | 九色婷婷 |