美文网首页
【Vesta发号器源码】IdConverterImpl

【Vesta发号器源码】IdConverterImpl

作者: DeanChangDM | 来源:发表于2019-05-13 14:04 被阅读0次

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;
    }

相关文章

网友评论

      本文标题:【Vesta发号器源码】IdConverterImpl

      本文链接:https://www.haomeiwen.com/subject/nivlaqtx.html