这个算法是CMPP2.0中产生Msg_Id的算法。 
算法如下: 
采用64位(8字节)的整数: 
(1) 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39, 
其中 
bit64~bit61:月份的二进制表示; 
bit60~bit56:日的二进制表示; 
bit55~bit51:小时的二进制表示; 
bit50~bit45:分的二进制表示; 
bit44~bit39:秒的二进制表示; 
(2) 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中。 
(3) 序列号:bit16~bit1,顺序增加,步长为1,循环使用。 
各部分如不能填满,左补零,右对齐。 请高手解答

解决方案 »

  1.   

    现写了一个,可以参考一下:public class Test {    public static void main(String[] args) {
            CmppMessageId messageId = CmppMessageId.next(12345);
            System.out.println("long: " + messageId.getMessageId());
            System.out.println(" hex: " + messageId.getHexMessageId());
            System.out.println(messageId);
            System.out.println("-------------------");
            long id = messageId.getMessageId();
            CmppMessageId pa = CmppMessageId.parse(id);
            System.out.println(pa);
            System.out.println(pa.equals(messageId));
            System.out.println("-------------------");
            String hex = messageId.getHexMessageId();
            CmppMessageId pb = CmppMessageId.parse(hex);
            System.out.println(pb);
            System.out.println(pb.equals(messageId));
        }
    }import java.util.Calendar;
    import java.util.concurrent.atomic.AtomicInteger;public class CmppMessageId {    private final static char[] HEX = "0123456789abcdef".toCharArray();    private static AtomicInteger atomic = new AtomicInteger(0);    private long messageId;    private int month;
        private int day;
        private int hour;
        private int minute;
        private int second;
        private int gateway;
        private int sequence;    private CmppMessageId() {
        }    private CmppMessageId(int gateway) {
            this.gateway = gateway;
            this.sequence = atomic.getAndIncrement() & 0xff;
            timeSetting();
            messageIdSetting();
        }    public static CmppMessageId next(int gateway) {
            return new CmppMessageId(gateway);
        }    public static CmppMessageId parse(long messageId) {
            CmppMessageId cmppMessageId = new CmppMessageId();
            cmppMessageId.messageId = messageId;
            cmppMessageId.month     = (int)((messageId >>> 60) & 0xf);
            cmppMessageId.day       = (int)((messageId >>> 55) & 0x1f);
            cmppMessageId.hour      = (int)((messageId >>> 50) & 0x1f);;
            cmppMessageId.minute    = (int)((messageId >>> 44) & 0x3f);;
            cmppMessageId.second    = (int)((messageId >>> 38) & 0x3f);;
            cmppMessageId.gateway   = (int)((messageId >>> 16) & 0x3fffff);;
            cmppMessageId.sequence  = (int)(messageId & 0xff);;
            return cmppMessageId;
        }    public static CmppMessageId parse(String hexMessageId) {
            return parse(Long.parseLong(hexMessageId, 16));
        }    private void timeSetting() {
            Calendar current = Calendar.getInstance();
            this.month = current.get(Calendar.MONTH) + 1;
            this.day = current.get(Calendar.DATE);
            this.hour = current.get(Calendar.HOUR_OF_DAY);
            this.minute = current.get(Calendar.MINUTE);
            this.second = current.get(Calendar.SECOND);
        }    private void messageIdSetting() {
            messageId |= (long)month << 60L;
            messageId |= (long)day << 55L;
            messageId |= (long)hour << 50L;
            messageId |= (long)minute << 44L;
            messageId |= (long)second << 38L;
            messageId |= (long)gateway << 16L;
            messageId |= (long)sequence & 0xffL;
        }    public String getHexMessageId() {
            char[] chs = new char[16];
            chs[ 0] = HEX[(int)((messageId >>> 60) & 0xf)];
            chs[ 1] = HEX[(int)((messageId >>> 56) & 0xf)];
            chs[ 2] = HEX[(int)((messageId >>> 52) & 0xf)];
            chs[ 3] = HEX[(int)((messageId >>> 48) & 0xf)];
            chs[ 4] = HEX[(int)((messageId >>> 44) & 0xf)];
            chs[ 5] = HEX[(int)((messageId >>> 40) & 0xf)];
            chs[ 6] = HEX[(int)((messageId >>> 36) & 0xf)];
            chs[ 7] = HEX[(int)((messageId >>> 32) & 0xf)];
            chs[ 8] = HEX[(int)((messageId >>> 28) & 0xf)];
            chs[ 9] = HEX[(int)((messageId >>> 24) & 0xf)];
            chs[10] = HEX[(int)((messageId >>> 20) & 0xf)];
            chs[11] = HEX[(int)((messageId >>> 16) & 0xf)];
            chs[12] = HEX[(int)((messageId >>> 12) & 0xf)];
            chs[13] = HEX[(int)((messageId >>>  8) & 0xf)];
            chs[14] = HEX[(int)((messageId >>>  4) & 0xf)];
            chs[15] = HEX[(int)(messageId & 0xf)];
            return new String(chs);
        }    public long getMessageId() {
            return messageId;
        }    public int getMonth() {
            return month;
        }    public int getDay() {
            return day;
        }    public int getHour() {
            return hour;
        }    public int getMinute() {
            return minute;
        }    public int getSecond() {
            return second;
        }    public int getGateway() {
            return gateway;
        }    public int getSequence() {
            return sequence;
        }    @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + day;
            result = prime * result + gateway;
            result = prime * result + hour;
            result = prime * result + (int) (messageId ^ (messageId >>> 32));
            result = prime * result + minute;
            result = prime * result + month;
            result = prime * result + second;
            result = prime * result + sequence;
            return result;
        }    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            CmppMessageId other = (CmppMessageId) obj;
            if (day != other.day)
                return false;
            if (gateway != other.gateway)
                return false;
            if (hour != other.hour)
                return false;
            if (messageId != other.messageId)
                return false;
            if (minute != other.minute)
                return false;
            if (month != other.month)
                return false;
            if (second != other.second)
                return false;
            if (sequence != other.sequence)
                return false;
            return true;
        }    public String toString() {
            return "MessageId: " + getHexMessageId() +
                   ", month: " + month +
                   ", day: " + day +
                   ", hour: " + hour +
                   ", minute: " + minute +
                   ", second: " + second +
                   ", gateway: " + gateway +
                   ", sequence: " + sequence;
        }
    }