ID・ジェネレータ、Twitterの雪のアルゴリズム

雪のアルゴリズムのコードは次のよう:

/ ** 
 * 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())。
        } 
    } 

}

 

おすすめ

転載: www.cnblogs.com/dayu007/p/12084716.html