日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現雪花算法(snowflake)

瀏覽:13日期:2022-08-26 09:20:50

本文主要介紹了Java實現雪花算法(snowflake),分享給大家,具體如下:

Java實現雪花算法(snowflake)

簡單描述

最高位是符號位,始終為0,不可用。

41位的時間序列,精確到毫秒級,41位的長度可以使用69年。時間位還有一個很重要的作用是可以根據時間進行排序。注意,41位時間截不是存儲當前時間的時間截,而是存儲時間截的差值(當前時間截 - 開始時間截) 后得到的值,這里的的開始時間截,一般是我們的id生成器開始使用的時間,由我們程序來指定的(如下下面程序SnowFlake類的START_STMP屬性)。41位的時間截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69 10位的機器標識,10位的長度最多支持部署1024個節點。 12位的計數序列號,序列號即一系列的自增id,可以支持同一節點同一毫秒生成多個ID序號,12位的計數序列號支持每個節點每毫秒產生4096個ID序號。

加起來剛好64位,為一個Long型。這個算法很簡潔,但依舊是一個很好的ID生成策略。其中,10位器標識符一般是5位IDC+5位machine編號,唯一確定一臺機器。

算法實現

public class SnowFlake { // 起始的時間戳 private final static long START_STMP = 1577808000000L; //2020-01-01 // 每一部分占用的位數,就三個 private final static long SEQUENCE_BIT = 12; //序列號占用的位數 private final static long MACHINE_BIT = 5; //機器標識占用的位數 private final static long DATACENTER_BIT = 5; //數據中心占用的位數 // 每一部分最大值 private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); // 每一部分向左的位移 private final static long MACHINE_LEFT = SEQUENCE_BIT; private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; private long datacenterId; //數據中心 private long machineId; //機器標識 private long sequence = 0L; //序列號 private long lastStmp = -1L; //上一次時間戳 public SnowFlake(long datacenterId, long machineId) { if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { throw new IllegalArgumentException('datacenterId can’t be greater than MAX_DATACENTER_NUM or less than 0'); } if (machineId > MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException('machineId can’t be greater than MAX_MACHINE_NUM or less than 0'); } this.datacenterId = datacenterId; this.machineId = machineId; } //產生下一個ID public synchronized long nextId() { long currStmp = timeGen(); if (currStmp < lastStmp) { throw new RuntimeException('Clock moved backwards. Refusing to generate id'); } if (currStmp == lastStmp) { //if條件里表示當前調用和上一次調用落在了相同毫秒內,只能通過第三部分,序列號自增來判斷為唯一,所以+1. sequence = (sequence + 1) & MAX_SEQUENCE; //同一毫秒的序列數已經達到最大,只能等待下一個毫秒 if (sequence == 0L) { currStmp = getNextMill(); } } else { //不同毫秒內,序列號置為0 //執行到這個分支的前提是currTimestamp > lastTimestamp,說明本次調用跟上次調用對比,已經不再同一個毫秒內了,這個時候序號可以重新回置0了。 sequence = 0L; } lastStmp = currStmp; //就是用相對毫秒數、機器ID和自增序號拼接 return (currStmp - START_STMP) << TIMESTMP_LEFT //時間戳部分 | datacenterId << DATACENTER_LEFT //數據中心部分 | machineId << MACHINE_LEFT //機器標識部分 | sequence;//序列號部分 } private long getNextMill() { long mill = timeGen(); while (mill <= lastStmp) { mill = timeGen(); } return mill; } private long timeGen() { return System.currentTimeMillis(); }}

當增加一秒生成ID的時候就是增加10位的機器標識+12位序列+約2的10次方(1000毫秒),最終就是增加一個2的32次方4 294 967 296就是42億左右

但是這里有一個坑,雪花算法產生的長整數的精度可能超過javascript能表達的精度,這會導致js獲取的id與雪花算法算出來的id不一致,如雪花算法得到的是36594866121080832,但是因為javascript丟失精度后只獲取到36594866121080830, 這會導致對數據的所有操作都失效。

解決辦法:后端的語言獲取到雪花算法的id后將其轉換為String類型,這樣js也會當做字符串來處理,就不會丟失精度了。

配置方法

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Autowired public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(toStringConverter()); } /** * BigDecimal Long 轉化為String * * @return */ @Bean public MappingJackson2HttpMessageConverter toStringConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(long.class, ToStringSerializer.instance); mapper.registerModule(simpleModule); // Include.Include.ALWAYS 默認 // Include.NON_DEFAULT 屬性為默認值不序列化 // Include.NON_EMPTY 屬性為 空('') 或者為 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量 // Include.NON_NULL 屬性為NULL 不序列化 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);// 允許出現特殊字符和轉義符 mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); // 允許出現單引號 converter.setObjectMapper(mapper); return converter; } @JacksonStdImpl static class BigDecimalToStringSerializer extends ToStringSerializer { public final static BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer(); public BigDecimalToStringSerializer() { super(Object.class); } public BigDecimalToStringSerializer(Class<?> handledType) { super(handledType); } @Override public boolean isEmpty(SerializerProvider prov, Object value) { if (value == null) { return true; } String str = ((BigDecimal) value).stripTrailingZeros().toPlainString(); return str.isEmpty(); } @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(((BigDecimal) value).stripTrailingZeros().toPlainString()); } @Override public JsonNode getSchema(SerializerProvider provider, Type typeHint) throws JsonMappingException { return createSchemaNode('string', true); } @Override public void serializeWithType(Object value, JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer) throws IOException { // no type info, just regular serialization serialize(value, gen, provider); } }}

到此這篇關于Java實現雪花算法(snowflake)的文章就介紹到這了,更多相關Java 雪花算法內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区调教| 亚洲香蕉视频| 国产精品一区二区av日韩在线| 久久国产高清| 日韩在线观看一区二区| 男女男精品网站| 日韩一区欧美二区| 美国三级日本三级久久99| 欧美精品一区二区久久| 麻豆精品视频在线观看免费| 蜜桃成人av| 欧美成人基地| 国产精品成人3p一区二区三区| 亚洲精品日本| 欧美日韩调教| 久久影院一区二区三区| 欧美日韩va| 国产精品99精品一区二区三区∴ | 日韩影院在线观看| 亚洲人成网77777色在线播放 | 亚洲欧美日韩视频二区| 美女国产一区| 97精品国产99久久久久久免费| 日本高清久久| 免费日韩成人| 秋霞影视一区二区三区| 国产午夜久久| 日韩激情视频网站| 成人在线免费观看网站| 99久久夜色精品国产亚洲狼| 美女尤物久久精品| 欧美日韩亚洲一区在线观看| 狂野欧美性猛交xxxx| 日韩高清中文字幕一区二区| 国产毛片久久| 欧美激情福利| 欧美日韩国产传媒| 综合激情一区| 欧美国产视频| 激情欧美亚洲| 日韩成人一级| 日韩在线短视频| 中文字幕亚洲精品乱码| 国产精品v亚洲精品v日韩精品| 中文字幕在线高清| 噜噜噜久久亚洲精品国产品小说| 国产精品毛片久久久| 久久九九99| 亚洲三级av| 欧美精品高清| 日韩精品视频在线看| 精品亚洲成人| 图片区亚洲欧美小说区| 天堂va欧美ⅴa亚洲va一国产| 美女高潮久久久| 精品一区免费| 国产精品一区毛片| 激情五月综合网| 国产欧美一区| 欧美 日韩 国产一区二区在线视频| 日本中文字幕不卡| 日韩欧美精品一区| 亚洲精品动态| 日韩在线观看不卡| 欧美视频久久| 91成人精品| 狂野欧美性猛交xxxx| 9国产精品视频| 精品日产乱码久久久久久仙踪林| 亚洲一区二区毛片| 国产精品久久观看| 91麻豆精品激情在线观看最新| 日韩在线综合| 国产三级精品三级在线观看国产| 免费观看久久av| 久久精品三级| 日韩视频一二区| 一区二区视频欧美| 视频在线不卡免费观看| 日韩美女精品| 精品91久久久久| www.九色在线| 欧美日韩亚洲一区| 在线精品视频一区| 不卡中文字幕| 国产h片在线观看| 国产欧美日韩在线观看视频| 久久xxxx| 四虎884aa成人精品最新| 国产精品手机在线播放| 日本大胆欧美人术艺术动态| 在线观看精品| 精品一区不卡| 国产精品a级| 欧美中文高清| 亚洲日韩视频| 久久午夜精品一区二区| 亚洲女同av| 欧美黄色一区| 国产欧美三级| 91成人福利| 亚洲三级精品| 免费在线观看日韩欧美| 午夜精品一区二区三区国产| 国产综合色区在线观看| 久久久久久网| 欧美经典一区| 国产精品九九| 国产亚洲人成a在线v网站| 免费在线欧美视频| 国产亚洲毛片在线| 久久亚洲在线| 日韩免费在线| 黄色在线观看www| 97精品在线| 91免费精品| 国产伦久视频在线观看| аⅴ资源天堂资源库在线| 国语精品一区| 精品国产午夜肉伦伦影院| 久久99青青| 精品国产18久久久久久二百| 精品色999| 日韩国产一区二区| 国产夫妻在线| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲一区二区三区无吗| 美女尤物久久精品| 免费久久精品视频| 亚洲色图综合| 日韩av黄色在线| 国产精品亚洲人成在99www| 国产精品videossex久久发布| 久久久免费人体| 久久久久久一区二区| 高清在线一区| 蜜臀国产一区| 好吊日精品视频| 蜜臀av国产精品久久久久| 日韩免费精品| 久久精品二区亚洲w码| 日韩精品永久网址| 国产亚洲在线观看| 天堂成人免费av电影一区| 最新亚洲国产| 国产精品一区二区精品视频观看| 精品三级国产| 国产精品97| 亚洲一区二区三区四区电影| 国产一精品一av一免费爽爽| 精品美女在线视频| 高潮一区二区| 中文一区在线| 91精品国产一区二区在线观看| 精品亚洲成人| 免费不卡中文字幕在线| 亚洲欧美在线综合| 免费在线日韩av| 欧美日韩精品一区二区视频| 日韩精品一二三| 捆绑调教美女网站视频一区| se01亚洲视频 | 国产尤物精品| 亚洲日本免费电影| 免费在线日韩av| 国精品一区二区三区| 中文字幕成人| 91一区二区| 在线精品一区| 国产96在线亚洲| 三级欧美韩日大片在线看| 欧美亚洲专区| 欧洲一级精品| 亚洲欧美网站在线观看| 久久不卡国产精品一区二区| 久久免费黄色| 中文字幕亚洲影视| 成人在线黄色| 亚洲涩涩av| 精品三级久久久| 黄色日韩精品| 麻豆精品在线观看| 亚洲激精日韩激精欧美精品| 国产精品久久久一区二区| 欧美69视频| 免费在线播放第一区高清av| 在线综合视频| 精品久久美女| 男女性色大片免费观看一区二区| 精品入口麻豆88视频| 蜜桃久久久久久| 日韩国产激情| 国产欧美精品久久| 国产农村妇女精品一二区| 美女精品久久| 免费成人性网站| 亚洲综合电影| 日韩高清不卡一区| 啪啪国产精品| 欧美a在线观看|