Vesta发号器源码解析——IdConverterImpl
IdConverter的实现类
主要是两个方法,用于解析ID,实现ID对象和long型id的互相转换
public IdConverterImpl() {
}
public long convert(Id id, IdMeta idMeta) {
return doConvert(id, idMeta);
}
//ID对象转换为long型的
protected long doConvert(Id id, IdMeta idMeta) {
long ret = 0;
//注意 这里是一个|=运算符,也就是按位或然后赋值
ret |= id.getMachine();
//先移位,然后按位或
ret |= id.getSeq() << idMeta.getSeqBitsStartPos();
//先移位,然后按位或
ret |= id.getTime() << idMeta.getTimeBitsStartPos();
//先移位,然后按位或
ret |= id.getGenMethod() << idMeta.getGenMethodBitsStartPos();
//先移位,然后按位或
ret |= id.getType() << idMeta.getTypeBitsStartPos();
//先移位,然后按位或
ret |= id.getVersion() << idMeta.getVersionBitsStartPos();
return ret;
}
public Id convert(long id, IdMeta idMeta) {
return doConvert(id, idMeta);
}
//将long型的转换为Id类型
protected Id doConvert(long id, IdMeta idMeta) {
Id ret = new Id();
//将id与掩码按位与掩码进行与操作,得到machineid
ret.setMachine(id & idMeta.getMachineBitsMask());
//先移位,把上一个字段移出去,然后按位跟掩码与获取对应字段
ret.setSeq((id >>> idMeta.getSeqBitsStartPos()) & idMeta.getSeqBitsMask());
//先移位,把上一个字段移出去,然后按位跟掩码与获取对应字段
ret.setTime((id >>> idMeta.getTimeBitsStartPos()) & idMeta.getTimeBitsMask());
//先移位,把上一个字段移出去,然后按位跟掩码与获取对应字段
ret.setGenMethod((id >>> idMeta.getGenMethodBitsStartPos()) & idMeta.getGenMethodBitsMask());
//先移位,把上一个字段移出去,然后按位跟掩码与获取对应字段
ret.setType((id >>> idMeta.getTypeBitsStartPos()) & idMeta.getTypeBitsMask());
//先移位,把上一个字段移出去,然后按位跟掩码与获取对应字段
ret.setVersion((id >>> idMeta.getVersionBitsStartPos()) & idMeta.getVersionBitsMask());
return ret;
}





网友评论