在实际的软件开发项目中。常常会涉及唯一序列号的生成。本文以一个实际的程序为例,介绍了唯一序列号的生成过程。

本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX。

程序例如以下:

/**********************************************************************
* 版权全部 (C)2014, Zhou Zhaoxiong。
*
* 文件名: SerialNo.c
* 文件标识: 无
* 内容摘要: 用于演示序列号的创建方法
* 其他说明: 无
* 当前版本号: V1.0
* 作        者: 周兆熊
* 完毕日期: 20140603
*
* 改动记录1:// 改动历史记录, 包含改动日期、版本号号、改动人及改动内容
* 改动日期: 20140603
* 版 本 号: V1.0
* 修 改 人: Zhou Zhaoxiong
* 改动内容: 创建
**********************************************************************/

#include <afxinet.h>

// 数据类型
typedef unsigned char       UINT8;
typedef unsigned char       UINT16;
typedef unsigned int           UINT32;
typedef signed   int             INT32;

// 时间信息结构体
typedef struct
{
 UINT8   second;        /* 0-59 */
 UINT8   minute;         /* 0-59 */
 UINT8   hour;             /* 0-23 */
 UINT8   day;              /* 1-31 */
 UINT8   month;           /* 1-12 */
 UINT16  year;             /* 1994-2099 */
 UINT8   week;             /* 1-7 */
 UINT8   Count10ms;  /* 0-99 */
} ClockStruc;

// 函数声明
void  GetCurTime(ClockStruc *pCurrentTime);                           // 获取当前时间
INT32 CreateSerial(UINT8 *pSerialID, UINT32 iSerialSize);     // 创建序列号
INT32 main(void);                                                                             // 主函数

/**********************************************************************
* 功能描写叙述: 获取当前时间                                            
* 输入參数: 无                                                      
* 输出參数: pCurrentTime-当前时间结构体                             
* 返 回 值: 无                                                      
* 其他说明: 无                                                      
* 改动日期      版本号号      改动人          改动内容                 
* ----------------------------------------------------------------------------
* 20140603       V1.0    Zhou Zhaoxiong       创建                   
**********************************************************************/
void GetCurTime(ClockStruc *pCurrentTime)
{
    SYSTEMTIME tCurrentTime;

GetLocalTime(&tCurrentTime);

pCurrentTime->month     = (UINT8)tCurrentTime.wMonth;
    pCurrentTime->day       = (UINT8)tCurrentTime.wDay;
    pCurrentTime->hour      = (UINT8)tCurrentTime.wHour;
    pCurrentTime->minute    = (UINT8)tCurrentTime.wMinute;
    pCurrentTime->second    = (UINT8)tCurrentTime.wSecond;
    pCurrentTime->week      = (UINT8)tCurrentTime.wDayOfWeek;
    if (pCurrentTime->week == 0)         // 表示星期天
    {
        pCurrentTime->week = 7;
    }
}

/**********************************************************************
* 功能描写叙述: 创建序列号
* 输入參数: iSerialSize: 序列号长度
* 输出參数: pSerialID: 序列号
* 返 回 值: 0-成功  -1-失败
* 其他说明: 序列号的样式: MMDDHHMINSS_XXXXXX
* 改动日期          版本号号           改动人         改动内容
* --------------------------------------------------------------
* 20140603           V1.0         Zhou Zhaoxiong      创建
***********************************************************************/
INT32 CreateSerial(UINT8 *pSerialID, UINT32 iSerialSize)
{
    ClockStruc    tClock   = {0};
    static UINT32 iTailNum = 0;
   
    if (NULL == pSerialID)
    {
        printf("CreateSerial: input parameter is NULL.\n");
        return -1;
    }

GetCurTime(&tClock);

_snprintf((char *)pSerialID, iSerialSize, "%02d%02d%02d%02d%02d_%06d",
             tClock.month, tClock.day, tClock.hour, tClock.minute, tClock.second, iTailNum);

iTailNum ++;
    if (iTailNum > 999999)
    {
        iTailNum = 0;
    }

return 0;
}

/****************************************************************
* 功能描写叙述:  主函数                                            
* 输入參数:  无                                                
* 输出參数:  无                                                
* 返 回 值: 0-运行成功  -1-运行失败                           
* 其他说明:  无                                                
* 改动日期        版本号号        改动人        改动内容
* ------------------------------------------------------------------------
* 20140603         V1.0     Zhou Zhaoxiong     创建
****************************************************************/
INT32 main(void)
{
    UINT32 iLoopFlag      = 0;      // 该变量用于表示循环标志
    INT32  iRetValue      = 0;        // 该变量用于表示调用CreateSerial函数返回的值
    UINT8  szSerialID[50] = {0};    // 该变量用于存放生成的序列号
   
    // 生成10个序列号, 并打印出来
    for (iLoopFlag = 0; iLoopFlag < 10; iLoopFlag ++)
    {
        iRetValue = CreateSerial(szSerialID, sizeof(szSerialID));
        if (iRetValue != 0)
        {
            printf("exec CreateSerial failed.\n");
            return -1;
        }
       
        printf("第%d个序列号为: %s\n", iLoopFlag + 1, szSerialID);
    }

return 0;
}

程序运行的结果例如以下图所看到的:

(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5。微信号:245924426,欢迎关注!

)

C程序中唯一序列号的生成的更多相关文章

  1. Java中唯一数的生成

    唯一数的生成很简单,基本上以时间为基础进行生成.在JDK里面已经有java.util.UUID类可以生成唯一的随机数.如果希望生成的唯一数为特定的格式,那么就需要自己来生成唯一数了.生成唯一数时有两个 ...

  2. 分布式系统中唯一 ID 的生成方法

    在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID? 在单机系统中 (例如一个 MySQL 实例), unique ID ...

  3. 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds

    RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...

  4. 微信小程序中用户唯一ID的获取

    折腾到半夜,搞得挺兴奋,总结一下,免得忘了: 1.微信小程序直接获得的是一些简单信息,基本无用 2.用户唯一标识是openid,还有一个unionid是关联多个公众号之类情况下用,我不大关心 3.在g ...

  5. 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  6. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  7. 5.把报表集成到Web应用程序中-生成网页和导出两种方式

    转自:https://wenku.baidu.com/view/104156f9770bf78a65295462.html 第四部分,把报表集成到Web应用程序中 用MyEclipse新建一个Web ...

  8. Delphi 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  9. 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

随机推荐

  1. swift官方文档中的switch中case let x where x.hasSuffix("pepper")是什么意思?

    在官方文档中,看到这句.但不明白什么意思. let vegetable = "red pepper" switch vegetable { case "celery&qu ...

  2. Python 基础 字符串拼接 + if while for循环

    注释单行注释 #多行注释 ''' 三个单引号或者三个双引号 """ ''' 用三引号引住可以多行赋值 用户交互 input 字符串拼接 +  ""%( ...

  3. Warning File `.depend' has modification time 1.6 s in the future

    一.前提知识 主机时间与虚拟机时间不同步所致.我们在某一操作系统所属磁盘空间下创建一个文件,那么这个文件的创建时间是以磁盘所属的操作系统的时钟为基准的. 我们假设主机windows的系统时间是10:0 ...

  4. Mac os 10.9下面配置JAVA_HOME

    刚入手的的MBP,就开始配置java环境,搜了一下网上的都是10.9以前的配置方法.jdk7在10.9的安装目录变化了. 首先到Oracle官网下载最新版本的java,直接默认安装 cd /etc s ...

  5. iOS: 填充数据表格

    功能:创建一个列表并填充 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lish ...

  6. JSP中使用的模式——JSP+Servlet+JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  7. BZOJ 4013 实验比较

    Description 小D被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有\(N\)张图片,编号为\(1\)到\(N\).实验分若干轮进行,在每轮实验中,小\(D\)会被要 ...

  8. BZOJ 3569 DZY Loves Chinese II

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  9. Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm

    Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...

  10. The Perfect Stall

    poj1274:http://poj.org/problem?id=1274 题意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东 ...