最近做一个项目要实现CMPP网关,基于不重复造轮子的原则,查遍开源社区也没有找到相关开源代码。
实在没有办法逼着自己学习已经还给老师的计算机原理,废话不多说,直接贴代码。

信息标识,生成算法如下:

采用64位(8字节)的整数:

  1. 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中

bit64~bit61:月份的二进制表示;

bit60~bit56:日的二进制表示;

bit55~bit51:小时的二进制表示;

bit50~bit45:分的二进制表示;

bit44~bit39:秒的二进制表示;

  1. 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中。
  2. 序列号:bit16~bit1,顺序增加,步长为1,循环使用。

各部分如不能填满,左补零,右对齐。

/// <summary>
    /// 信息标识
    /// 生成算法如下:
    /// 采用64位(8字节)的整数:
    /// (1)时间(格式为MMDDHHMMSS,即月日时分秒):bit64 ~bit39,其中
    /// bit64~bit61:月份的二进制表示;
    /// bit60 ~bit56:日的二进制表示;
    /// bit55 ~bit51:小时的二进制表示;
    /// bit50 ~bit45:分的二进制表示;
    /// bit44 ~bit39:秒的二进制表示;
    /// (2)短信网关代码:bit38 ~bit17,把短信网关的代码转换为整数填写到该字段中。
    /// (3)序列号:bit16 ~bit1,顺序增加,步长为1,循环使用。
    /// 各部分如不能填满,左补零,右对齐。
    /// </summary>
    public class CmppMsgId
    {
        private static char[] HEX = "0123456789abcdef".ToCharArray();
        private static volatile short _sequenceId = 0;
        private  static short NextSequenceId { get { return _sequenceId++; } }

private long msgId;
        private int month;
        private int day;
        private int hour;
        private int minute;
        private int second;
        private int gateway;
        private int sequence;
        private CmppMsgId()
        {

}
        private CmppMsgId(int gateway)
        {
            this.gateway = gateway;
            this.sequence = NextSequenceId & 0xff;
            TimeSetting();
            MsgIdSetting();
        }

public static CmppMsgId Next(int gateway)
        {
            return new CmppMsgId(gateway);
        }
        public static CmppMsgId Parse(string hexMessageId)
        {
            return Parse(Int64.Parse(hexMessageId));
        }
        public static CmppMsgId Parse(long msgId)
        {
            CmppMsgId cmppMsgId = new CmppMsgId();
            cmppMsgId.msgId = msgId;
            cmppMsgId.month = (int)((msgId >> 60) & 0xf);
            cmppMsgId.day = (int)((msgId >> 55) & 0x1f);
            cmppMsgId.hour = (int)((msgId >> 50) & 0x1f);
            cmppMsgId.minute = (int)((msgId >> 44) & 0x3f);
            cmppMsgId.second = (int)((msgId >> 38) & 0x3f);
            cmppMsgId.gateway = (int)((msgId >> 16) & 0x3fffff);
            cmppMsgId.sequence = (int)(msgId & 0xff);
            return cmppMsgId;
        }

private void TimeSetting()
        {
            this.month = DateTime.Now.Month;
            this.day = DateTime.Now.Day;
            this.hour = DateTime.Now.Hour;
            this.minute = DateTime.Now.Minute;
            this.second = DateTime.Now.Second;
        }

private void MsgIdSetting()
        {
            msgId |= (long)month << 60;
            msgId |= (long)day << 55;
            msgId |= (long)hour << 50;
            msgId |= (long)minute << 44;
            msgId |= (long)second << 38;
            msgId |= (long)gateway << 16;
            msgId |= (long)sequence & 0xff;
        }

public String GetHexMsgId()
        {
            char[] chs = new char[16];
            chs[0] = HEX[(int)((msgId >> 60) & 0xf)];
            chs[1] = HEX[(int)((msgId >> 56) & 0xf)];
            chs[2] = HEX[(int)((msgId >> 52) & 0xf)];
            chs[3] = HEX[(int)((msgId >> 48) & 0xf)];
            chs[4] = HEX[(int)((msgId >> 44) & 0xf)];
            chs[5] = HEX[(int)((msgId >> 40) & 0xf)];
            chs[6] = HEX[(int)((msgId >> 36) & 0xf)];
            chs[7] = HEX[(int)((msgId >> 32) & 0xf)];
            chs[8] = HEX[(int)((msgId >> 28) & 0xf)];
            chs[9] = HEX[(int)((msgId >> 24) & 0xf)];
            chs[10] = HEX[(int)((msgId >> 20) & 0xf)];
            chs[11] = HEX[(int)((msgId >> 16) & 0xf)];
            chs[12] = HEX[(int)((msgId >> 12) & 0xf)];
            chs[13] = HEX[(int)((msgId >> 8) & 0xf)];
            chs[14] = HEX[(int)((msgId >> 4) & 0xf)];
            chs[15] = HEX[(int)(msgId & 0xf)];
            return new String(chs);
        }
        public DateTime EventTime
        {
            get
            {
                return new DateTime(DateTime.Now.Year, month, day, hour, minute, second);
            }
        }
        public ulong MsgId
        {
            get
            {
                return (ulong)msgId;
            }
        }
        public int Month
        {
            get
            {
                return month;
            }
        }
        public int Day
        {
            get
            {
                return day;
            }
        }
        public int Hour
        {
            get
            {
                return hour;
            }
        }

public int Minute
        {
            get
            {
                return minute;
            }
        }

public int Second
        {
            get
            {
                return second;
            }
        }

public int Gateway
        {
            get
            {
                return gateway;
            }
        }

public uint Sequence
        {
            get
            {
                return (uint)sequence;
            }
        }
        public override int GetHashCode()
        {
            int prime = 31;
            int result = 1;
            result = prime * result + day;
            result = prime * result + gateway;
            result = prime * result + hour;
            result = prime * result + (int)(msgId ^ (msgId >> 32));
            result = prime * result + minute;
            result = prime * result + month;
            result = prime * result + second;
            result = prime * result + sequence;
            return result;
        }

public override bool Equals(object obj)
        {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (!(obj is CmppMsgId))
                return false;
            CmppMsgId other = (CmppMsgId)obj;
            if (day != other.day)
                return false;
            if (gateway != other.gateway)
                return false;
            if (hour != other.hour)
                return false;
            if (msgId != other.msgId)
                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 override string ToString()
        {
            return "MsgId: " + GetHexMsgId() +
                   ", month: " + month +
                   ", day: " + day +
                   ", hour: " + hour +
                   ", minute: " + minute +
                   ", second: " + second +
                   ", gateway: " + gateway +
                   ", sequence: " + sequence;
        }

}

Cmpp MsgId 生成算法相关推荐

  1. RocketMQ 介绍 msgId生成算法

    我们用RocketMQ发送信息的时候通常都会返回如下信息: SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000 ...

  2. php hmacsha1计算,PHP HMAC_SHA1 算法 生成算法签名

    HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...

  3. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

  4. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  5. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  6. 无需向量监督的矢量图生成算法,入选CVPR 2021 | 代码开源

    说起图像生成算法,大家也许并不陌生. 不过,大多数算法都针对栅格图像,也就是位图,而不支持矢量图. 虽然也有一些生成矢量图形的算法,但是在监督训练中,又受限于矢量图数据集有限的质量和规模. 为此,来自 ...

  7. 实验三:实现一个大素数生成算法

    一.实验内容 掌进一步掌握大素数分解的一般原理和实现方法.能用间接方法实现大素数分解.用代码实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法. 二.分实现一个大素数生 ...

  8. c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析

    1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图:   ...

  9. Chirp信号公式与对离散生成算法之间的差异

    讨论产生线性频率变化的公式和它的离散公式之间的差异,并提出Chirp信号的修改方案. Chirp信号的公式 对于固定频率f1f_1f1​的信号,它的表达式为:r(t)=cos⁡(2π⋅f1⋅t)r\l ...

最新文章

  1. linux awk命令
  2. 专家谈计算机体系架构研究获“图灵奖”
  3. 【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结
  4. linux-2.6.18源码分析笔记---中断
  5. OpenSCAD 建模:矿泉水瓶盖
  6. 总结20121016
  7. 庞佐错觉_水晶球错觉
  8. python工作区是什么_在IPython中保存工作区
  9. flink sql设置并行度_Flink原理——任务调度原理
  10. linux下输入法终极解决方案
  11. Win10 LTSC 2021安装及相关bug解决
  12. 使用Wps切分单页PDF文件为多页pdf
  13. 这些最真实的 “猥琐程序员”,今天必须曝光!
  14. html想实现文字环绕图片,HTML/CSS实现文字环绕图片布局
  15. 人行各地中支征信服务“再升级”
  16. Python下载网易云歌曲(版权限制的怎么播放和下载呢?)
  17. 计算机速成课 第三十七集 机器人
  18. spring-boot-mvc启动流程
  19. echart 三维可视化地图_使用 ECharts GL 实现三维可视化 - 入门款
  20. BZOJ#3267. KC采花

热门文章

  1. 室内定位——UWB测距及定位原理
  2. OpenCV python 图片镜像
  3. python乌龟画五角星_使用Python的turtle模块画五角星
  4. Fast Affine Template Matching over Galois Field仿射模板匹配数据测试问题
  5. 惠云转债上市价格预测
  6. COBIT(cobit框架)
  7. word文档可以打开但显示乱码的完全解决攻略
  8. 福昕PDF开启多实例
  9. Arduino零基础实践——1
  10. Doris 与 ClickHouse 的深度对比