package org.howsun.dao;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.concurrent.atomic.AtomicInteger;
import org.howsun.core.exception.AssertException;
import org.howsun.util.Randoms;
/**
* 功能描述:自定义实体ID,
* 目前暂定格式为: SSSSSSSS MM HASH
* Long.mv:92233 72036854 77 5807
* 目标:
* 1.隐含时间信息,省去创建时间字段
* 2.具有顺序
* 3.前端不易测
*
*
* 参考Bson的 @see org.bson.types.ObjectId
*
* @author howsun(howsun.zhang@google.com)
* @version 1.0.0
*/
public class EntityId {
private static AtomicInteger nextInc = new AtomicInteger(10);
/**从2010_10_10_10_10_10开始*/
public static final long START_SECOEND = 1286676610;
private long id = -1;
private int hash;
private Calendar time;
private int module;
private boolean lastNot4;
//private int machine;
//反系列化
public EntityId(){
}
//系列化
public EntityId(int module){
this(module, false);
}
public EntityId(int module, boolean latsNot4){
if(module < 0 || module > 99){
throw new AssertException("模块编号必须是1-99之间的数字");
}
this.hash = nextInc.getAndIncrement() & 0xFFF;
this.module = module;
this.lastNot4 = latsNot4;
generatedId();
}
/**
* 创建主键
*/
private void generatedId(){
hash += Randoms.nextInt(5900);
id += (System.currentTimeMillis()/1000 - START_SECOEND) * 1000000;
id += module * 10000;
id += hash;
if(lastNot4 && id % 10 == 4){
id += 4;
}
}
/**
* 解析主键
*/
public EntityId parse(long id){
this.id = id;
long TEMP = id / 1000000;
this.time = Calendar.getInstance();
time.setTimeInMillis((TEMP + START_SECOEND) * 1000L);
TEMP = id % (TEMP * 1000000);
this.module = (int) (TEMP / 10000);
this.hash = (int) ( (TEMP - this.module * 10000 ) );
return this;
}
/**
* int z = flip((int)(System.currentTimeMillis()/1000));
long zDate = flip(z);
zDate *= 1000;
System.out.println(new Date(zDate));
* @param x
* @return
*/
public static int flip( int x ){
int z = 0;
z |= ( ( x << 24 ) & 0xFF000000 );
z |= ( ( x << 8 ) & 0x00FF0000 );
z |= ( ( x >> 8 ) & 0x0000FF00 );
z |= ( ( x >> 24 ) & 0x000000FF );
return z;
}
public int getHash() {
return hash;
}
public void setHash(int hash) {
this.hash = hash;
}
public Calendar getTime() {
return time;
}
public void setId(long id) {
this.id = id;
}
public void setLastNot4(boolean lastNo4) {
this.lastNot4 = lastNo4;
}
public long getId(){
return id;
}
public int getModule() {
return module;
}
public static void main(String[] args) throws Exception {
long j = 1;
for (int i = 0; i < 10; i++) {
Thread.sleep(1001);
EntityId id = new EntityId(11,true);
j = id.getId();
System.out.println(j);
}
EntityId o = new EntityId().parse(j);
System.out.println(DateFormat.getDateTimeInstance().format(o.getTime().getTime()));
System.out.println(o.getModule());
System.out.println(o.getHash());
}
}