雪のアルゴリズムのコードは次のよう:
/ ** * IDジェネレータ、Twitterのアルゴリズム雪 * @authorの管理者 * / パブリック クラスIDWorker { / ** *開始タイムスタンプ * / プライベート 最終 静的 ロング START_STMP = 1480166465631L ; / ** *各部分が占有ビット * / プライベート 最終 静的 ロング SEQUENCE_BIT = 12であり; // ビットのシーケンス番号が占有 プライベート 最終 静的 ロング MACHINE_BIT = 5; // ビットの機械識別番号によって占有 プライベート 最終 静的 ロング DATACENTER_BIT = 5; //ビットの数は、データセンタによって占め / ** *最大値の各部分が * / プライベート 最終 静的 ロング MAX_DATACENTER_NUM -1L = ^(-1L << DATACENTER_BIT); プライベート 最終 静的 ロング MAX_MACHINE_NUM -1L = ^(-1L << MACHINE_BIT) ; プライベート 最終 静的 ロング MAX_SEQUENCE -1L = ^(-1L << ; SEQUENCE_BIT) / ** 各部分の*左方向変位 * / プライベート 最終 静的 ロング MACHINE_LEFT = SEQUENCE_BIT; プライベート 最終 静的 ロング DATACENTER_LEFT + = SEQUENCE_BITMACHINE_BIT; プライベート 決勝 静的 ロング TIMESTMP_LEFT + = DATACENTER_LEFT DATACENTER_BIT; プライベート ロング datacenterId; // データセンター 専用 ロング MachineID; // マシンの識別 プライベート ロングシーケンス= 0L; // 配列番号 プライベート ロング lastStmp = -1L; // 最初の時間スタンプ 公共 IDWorker(ロング datacenterId、ロングMachineID){ IF(datacenterId> MAX_DATACENTER_NUM || datacenterId <0 ){ スロー 新新IllegalArgumentExceptionが(「datacenterIdはMAX_DATACENTER_NUM以上0未満にすることはできません」)。 } であれば(machineId> MAX_MACHINE_NUM || machineId <0 ){ スロー 新しい、IllegalArgumentExceptionを( "machineIdがMAX_MACHINE_NUM未満または0より大きくすることはできません" )。 } この .datacenterId = datacenterId。 この .machineId = machineId。 } / ** *产生下一个ID * * @return * / パブリック 同期 長いNEXTID(){ 長い currStmp =getNewstmp(); IF(currStmp < lastStmp){ スロー 新しい新しい RuntimeExceptionは、( "クロックIDを生成することを拒否後退。" ); } IF(currStmp == lastStmp){ // 同じミリ秒以内に、シーケンス番号がインクリメント シーケンスを=(配列1 +)&MAX_SEQUENCE; // 同一の系列数が最大ミリ秒に達した IF(配列== 0L ){ currStmp = getNextMill(); } } 他{ // 異なるMS、シーケンス番号が0に設定されている 配列= 0L。 } lastStmp = currStmp; リターン(currStmp - START_STMP)<< TIMESTMP_LEFT // スタンプコンポーネント | << DATACENTER_LEFT datacenterId // データセンタ部分 | << MACHINE_LEFT MachineID // 機械識別部 |配列; // シリアル番号の一部 } プライベート ロングgetNextMill (){ ロングミル= getNewstmp(); 一方、(ミル<= lastStmp){ ミル = getNewstmp(); } 戻り工場; } プライベート ロングgetNewstmp(){ リターンのSystem.currentTimeMillis(); } パブリック 静的 ボイドメイン(文字列[]引数){ IDWorker idWorker = 新しい IDWorker(2、3 )。 以下のために(INT I = 0; I <10; I ++ ){ System.out.printlnは(idWorker.nextId())。 } } }