[KANMARS原创] - 分布式系统一致性hash中的key-全局唯一ID生成器-加强版
上次写了个IDCreateUtils,有点累赘,这次更新了一下,这个是通用版,直接给一个数字设置第start到第end位的值
package cn.kanmars;
/
Created by baolong on 2015/12/1.
/
public class IDCreaterPlusUtils {
/
掩码制造,从0开始,包含start,包含end,start>=0,end<=63
@param start 0<=start<=63
@param end 0<=end<=63
@return
/
public static long createMask(int start,int end) throws Exception{
if(start <0 || start >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=start<=63 “);
if(end <0 || end >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=end<=63 “);
if(end < start) throw new Exception(“IDCreaterPlusUtils createMask must: end >= start”);
long result = 0xffffffffffffffffl;
result = result << (64-(end+1-start));
result = result >>> start;
return result;
}
/**
给old代表的64位数字中的第start到第end位,设置一个数字为val,如果val超出start和end的长度区间,则舍弃掉超出的内容
@param old 原始数据
@param val 要设置进去的数据
@param start 开始位置,0<=start<=end<=63,闭区间
@param end 结束位置,0<=start<=end<=63, 闭区间
@return
@throws Exception
/
public static long setValue(long old,long val,int start,int end) throws Exception{
if(start <0 || start >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=start<=63 “);
if(end <0 || end >63 ) throw new Exception(“IDCreaterPlusUtils createMask must: 0<=end<=63 “);
if(end < start) throw new Exception(“IDCreaterPlusUtils createMask must: end >= start”);
long result = old;
long mask = createMask(start,end);
result = result & (0xffffffffffffffffl ^ mask);//result与掩码的反码进行与操作,将指定位置为0
long value = val;
value = value << (64-(end+1-start)); //左移到指定位置
value = value >>> start;
value = value & mask; //与掩码进行计算
result = result | value; //将原值与新值进行组合
return result;
}
/**
打印一个long的二进制码,不分割
@param l
@return
/
public static String pl64(long l){
return pl64(l,false);
}
/**
打印一个long的二进制码
@param l 要打印的数值
@param split 是否每4位分割
@return
/
public static String pl64(long l,boolean split){
StringBuilder sb = new StringBuilder();
for(int i=0;i<64;i++){
sb.append(pl(l, i));
if((i+1)%4 ==0 && split){
sb.append(“ “);
}
}
sb.append(“\r\n”);
return sb.toString();
}
/*
打印l 的从0开始第index位的数据
@param l
@param index
*/
public static String pl(long l,int index){
return (0x0000000000000001L & (l>> (63-index)))+””;
}
public static void main(String[] args) throws Exception {
//System.out.println(pl64(createMask(5,7)));
long val = 0;
val = setValue(val,15,3,6);
System.out.println(pl64(val));
}
}
package cn.kanmars;
import java.util.Date;
public class LongTransfer {
/*char 62 ,
用来处理62进制
/
private static char[] info = {
’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,
’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’,
’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,’x’,’y’,’z’,
};
private static int jz = 62;
public static void main(String[] args) {
System.out.println(new Date(100,11,31));
//long long的最大值:9223372036854775807
//long long的最小值:-9223372036854775808
// System.out.println(getStrFrom(9223372036854775807l));//hezMo7
// System.out.println(getLongFrom(“aZl8N0y58M7”));
for(int i=0;i<10;i++){
long date = new Date(100,11,31).getTime();//获取1900+300 = 2200年的时间
date = date/1000;
String str = getStrFrom(date);
long result = getLongFrom(str);
System.out.print(date+” “);
System.out.print(str+” “);
System.out.print(result+” “);
System.out.println(“ “+(date==result?”true”:”false”));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static String getStrFrom(long l){
StringBuffer sb = new StringBuffer();
if(l==0)return “0”;
int jz = jz;
while(l/jz >= 0){
if(l==0){
//sb.insert(0, info[0]);
break;
}
char c = info[(int)(l%jz)];
//System.out.println((int)(l%62));
sb.insert(0, c);
l=l/jz;
}
return sb.toString();
}
public static long getLongFrom(String str){
long result = 0;
int jz = jz_;
int strlength = str.length();
char[] cc = new char[strlength];
str.getChars(0, strlength, cc, 0);
for(int i=0,j=strlength;i<j;i++ ){
int num = -1;
char c = cc[i];
if(‘0’<=c&&c<=’9’){
num = c-‘0’;
}
if(‘a’<=c&&c<=’z’){
num = c-‘a’+10;
}
if(‘A’<=c&&c<=’Z’){
num = c-‘A’+36;
}
//System.out.println(num);
result = resultjz + num;
}
return result;
}
}