Cmpp MsgId 生成算法
最近做一个项目要实现CMPP网关,基于不重复造轮子的原则,查遍开源社区也没有找到相关开源代码。
实在没有办法逼着自己学习已经还给老师的计算机原理,废话不多说,直接贴代码。
信息标识,生成算法如下:
采用64位(8字节)的整数:
- 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
bit64~bit61:月份的二进制表示;
bit60~bit56:日的二进制表示;
bit55~bit51:小时的二进制表示;
bit50~bit45:分的二进制表示;
bit44~bit39:秒的二进制表示;
- 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中。
- 序列号: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 生成算法相关推荐
- RocketMQ 介绍 msgId生成算法
我们用RocketMQ发送信息的时候通常都会返回如下信息: SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000 ...
- php hmacsha1计算,PHP HMAC_SHA1 算法 生成算法签名
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...
- 获取序列全排列Java,java中全排列的生成算法汇总
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...
- 用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 ...
- 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...
from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...
- 无需向量监督的矢量图生成算法,入选CVPR 2021 | 代码开源
说起图像生成算法,大家也许并不陌生. 不过,大多数算法都针对栅格图像,也就是位图,而不支持矢量图. 虽然也有一些生成矢量图形的算法,但是在监督训练中,又受限于矢量图数据集有限的质量和规模. 为此,来自 ...
- 实验三:实现一个大素数生成算法
一.实验内容 掌进一步掌握大素数分解的一般原理和实现方法.能用间接方法实现大素数分解.用代码实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法. 二.分实现一个大素数生 ...
- c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析
1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图: ...
- Chirp信号公式与对离散生成算法之间的差异
讨论产生线性频率变化的公式和它的离散公式之间的差异,并提出Chirp信号的修改方案. Chirp信号的公式 对于固定频率f1f_1f1的信号,它的表达式为:r(t)=cos(2π⋅f1⋅t)r\l ...
最新文章
- linux awk命令
- 专家谈计算机体系架构研究获“图灵奖”
- 【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结
- linux-2.6.18源码分析笔记---中断
- OpenSCAD 建模:矿泉水瓶盖
- 总结20121016
- 庞佐错觉_水晶球错觉
- python工作区是什么_在IPython中保存工作区
- flink sql设置并行度_Flink原理——任务调度原理
- linux下输入法终极解决方案
- Win10 LTSC 2021安装及相关bug解决
- 使用Wps切分单页PDF文件为多页pdf
- 这些最真实的 “猥琐程序员”,今天必须曝光!
- html想实现文字环绕图片,HTML/CSS实现文字环绕图片布局
- 人行各地中支征信服务“再升级”
- Python下载网易云歌曲(版权限制的怎么播放和下载呢?)
- 计算机速成课 第三十七集 机器人
- spring-boot-mvc启动流程
- echart 三维可视化地图_使用 ECharts GL 实现三维可视化 - 入门款
- BZOJ#3267. KC采花