package Ġcom . q ing zh u . common . message Ċ Ċ /** Ċ Ġ* ĠSnow Fl ake Ġåľ¨ è½¬æį¢ ä¸º ĠDouble ĠæĹ¶ ä¼ļ ä¸ ¢ å¤± ä½İ ä½į ç²¾ åº¦ Ċ Ġ*/ Ċ class ĠSnow Fl ake ( private Ġval Ġdata Center Id : ĠLong , Ġprivate Ġval Ġservice Id : ĠLong ) Ġ: ĠSequence Generator Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ èµ· å§ĭ çļĦæĹ¶éĹ´ æĪ ³ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġstart Stamp Ġ= Ġ 1 6 0 6 0 7 1 0 8 8 7 2 3 L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĹ¶éĹ´ æĪ ³ é«ĺ ä½į æĪª åıĸ Ġ 6 3 Ġ- Ġ 1 1 Ġ= Ġ 5 2 ĊĠĠĠĠ Ġ* Ġ åĩı 1 0 ä¿ĿçķĻ äºĨ ç¬¦ åı· ä½į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġintercept Ġ= ĠLong . MAX _ VALUE Ġshr Ġ 1 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ı ä¸Ģ éĥ¨åĪĨ åįł çĶ¨çļĦ ä½į æķ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ è°ĥ ä½İ äºĨ 4 ä½į ï¼Į èĩª å¢ŀ åĢ¼ æĶ¯æĮģ ä»İ åĲĮ ä¸Ģ æ¯ « ç§Ĵ åĨħ åĲĮ ä¸Ģä¸ª èĬĤçĤ¹ åı¯ä»¥ çĶŁæĪĲ Ġ 4 0 9 6 Ġä¸ª ĠID Ġ æĶ¹ ä¸º Ġ 2 5 6 Ġä¸ª ĊĠĠĠ Ġprivate Ġval Ġsequence Bit : ĠInt Ġ= Ġ 8 Ġ// Ġ 1 2 Ġ// åºıåĪĹ åı· åįł çĶ¨çļĦ ä½į æķ° ĊĠĠĠ Ġprivate Ġval Ġmachine Bit : ĠInt Ġ= Ġ 3 Ġ// Ġ 5 ĠĠ Ġ// æľºåĻ¨ æłĩè¯Ĩ åįł çĶ¨çļĦ ä½į æķ° ĊĠĠĠ Ġ// Ġprivate Ġval Ġdata Center Bit : ĠInt Ġ= Ġ 5 // æķ°æį® ä¸Ńå¿ĥ åįł çĶ¨çļĦ ä½į æķ° ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ı ä¸Ģ éĥ¨åĪĨ çļĦ æľĢå¤§ åĢ¼ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġprivate Ġval Ġmax Data Center Num Ġ= Ġ- 1 L Ġxor Ġ(- 1 L Ġshl Ġdata Center Bit ) ĊĠĠĠ Ġprivate Ġval Ġmax Machine Num Ġ= Ġ- 1 L Ġxor Ġ(- 1 L Ġshl Ġmachine Bit ) ĊĠĠĠ Ġprivate Ġval Ġmax Sequence Ġ= Ġ- 1 L Ġxor Ġ(- 1 L Ġshl Ġsequence Bit ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ı ä¸Ģ éĥ¨åĪĨ åĲĳ å·¦ çļĦ ä½į ç§» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmachine Left Ġ= Ġsequence Bit ĊĊĠĠĠ Ġ// Ġprivate Ġval Ġdata Center Left Ġ= Ġsequence Bit Ġ+ Ġmachine Bit ĊĠĠĠ Ġprivate Ġval Ġtimestamp Left Ġ= Ġsequence Bit Ġ+ Ġmachine Bit Ġ// Ġdata Center Left Ġ+ Ġdata Center Bit ĊĊĠĠĠ Ġprivate Ġvar Ġsequence Ġ= Ġ 0 L Ġ// åºıåĪĹ åı· ĊĠĠĠ Ġprivate Ġvar Ġlast Stamp Ġ= Ġ- 1 L // ä¸Ĭ ä¸Ģæ¬¡ æĹ¶éĹ´ æĪ ³ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( data Center Id Ġ> Ġmax Data Center Num Ġ|| Ġdata Center Id Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġthrow ĠIllegalArgumentException (" datac enter Id Ġcan 't Ġbe Ġgreater Ġthan ĠMAX _ DAT AC ENTER _ NUM Ġor Ġless Ġthan Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( service Id Ġ> Ġmax Machine Num Ġ|| Ġservice Id Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" machine Id Ġcan 't Ġbe Ġgreater Ġthan ĠMAX _ MACHINE _ NUM Ġor Ġless Ġthan Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠçĶŁæĪĲ Ġ èĩª å¢ŀ Ġ åĶ¯ä¸Ģ Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun ĠgetNext Sequence Id (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurr Stamp Ġ= Ġget New Stamp () ĊĠĠĠĠĠĠĠ Ġif Ġ( curr Stamp Ġ< Ġlast Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Clock Ġmoved Ġbackwards . Ġ ĠRef using Ġto Ġgenerate Ġid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( curr Stamp Ġ== Ġlast Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// çĽ¸åĲĮ æ¯ « ç§Ĵ åĨħ ï¼Į åºıåĪĹ åı· èĩª å¢ŀ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Ġ= Ġsequence Ġ+ Ġ 1 Ġand Ġmax Sequence ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĲĮ ä¸Ģ æ¯ « ç§Ĵ çļĦ åºıåĪĹ æķ° å·²ç»ı è¾¾ åĪ° æľĢå¤§ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sequence Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Stamp Ġ= ĠgetNext M ill () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸įåĲĮ æ¯ « ç§Ĵ åĨħ ï¼Į åºıåĪĹ åı· ç½® ä¸º 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Stamp Ġ= Ġcurr Stamp ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æĹ¶éĹ´ ä¸ĢèĪ¬ æĺ¯ Ġ 4 1 Ġ ä½į ĊĠĠĠĠĠĠĠ Ġreturn Ġ( curr Stamp Ġ- Ġstart Stamp Ġshl Ġtimestamp Left Ġ// æĹ¶éĹ´ æĪ ³ éĥ¨åĪĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor Ġ( data Center Id Ġshl Ġdata Center Left ĠĠĠĠĠĠ Ġ// æķ°æį® ä¸Ńå¿ĥ éĥ¨åĪĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġ( service Id Ġshl Ġmachine Left ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æľºåĻ¨ æłĩè¯Ĩ éĥ¨åĪĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġsequence ) Ġand Ġintercept ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åºıåĪĹ åı· éĥ¨åĪĨ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNext M ill (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmill Ġ= Ġget New Stamp () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( mill Ġ<= Ġlast Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmill Ġ= Ġget New Stamp () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmill ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget New Stamp (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} Ċ }