`
song020cn
  • 浏览: 63337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++伪GUID

    博客分类:
  • c++
阅读更多
static inline int secondNow() {
    struct timeval v;
    gettimeofday(&v, (struct timezone *) NULL);
    /* Unix Epoch time (time since January 1, 1970 (UTC)) */
    return v.tv_sec + v.tv_usec/1.0e6;
}

static struct tm* secondsSinceEpochToDateTime(struct tm* pTm, uint64_t SecondsSinceEpoch)
{
    uint64_t sec;
    uint quadricentennials, centennials, quadrennials, annuals/*1-ennial?*/;
    uint year, leap;
    uint yday, hour, min;
    uint month, mday, wday;
    static const uint daysSinceJan1st[2][13]=
    {
        {0,31,59,90,120,151,181,212,243,273,304,334,365}, // 365 days, non-leap
        {0,31,60,91,121,152,182,213,244,274,305,335,366}  // 366 days, leap
    };
    /*
     400 years:
     
     1st hundred, starting immediately after a leap year that's a multiple of 400:
     n n n l  \
     n n n l   } 24 times
     ...      /
     n n n l /
     n n n n
     
     2nd hundred:
     n n n l  \
     n n n l   } 24 times
     ...      /
     n n n l /
     n n n n
     
     3rd hundred:
     n n n l  \
     n n n l   } 24 times
     ...      /
     n n n l /
     n n n n
     
     4th hundred:
     n n n l  \
     n n n l   } 24 times
     ...      /
     n n n l /
     n n n L <- 97'th leap year every 400 years
     */
    
    // Re-bias from 1970 to 1601:
    // 1970 - 1601 = 369 = 3*100 + 17*4 + 1 years (incl. 89 leap days) =
    // (3*100*(365+24/100) + 17*4*(365+1/4) + 1*365)*24*3600 seconds
    sec = SecondsSinceEpoch + 11644473600;
    
    wday = (uint)((sec / 86400 + 1) % 7); // day of week
    
    // Remove multiples of 400 years (incl. 97 leap days)
    quadricentennials = (uint)(sec / 12622780800ULL); // 400*365.2425*24*3600
    sec %= 12622780800ULL;
    
    // Remove multiples of 100 years (incl. 24 leap days), can't be more than 3
    // (because multiples of 4*100=400 years (incl. leap days) have been removed)
    centennials = (uint)(sec / 3155673600ULL); // 100*(365+24/100)*24*3600
    if (centennials > 3)
    {
        centennials = 3;
    }
    sec -= centennials * 3155673600ULL;
    
    // Remove multiples of 4 years (incl. 1 leap day), can't be more than 24
    // (because multiples of 25*4=100 years (incl. leap days) have been removed)
    quadrennials = (uint)(sec / 126230400); // 4*(365+1/4)*24*3600
    if (quadrennials > 24)
    {
        quadrennials = 24;
    }
    sec -= quadrennials * 126230400ULL;
    
    // Remove multiples of years (incl. 0 leap days), can't be more than 3
    // (because multiples of 4 years (incl. leap days) have been removed)
    annuals = (uint)(sec / 31536000); // 365*24*3600
    if (annuals > 3)
    {
        annuals = 3;
    }
    sec -= annuals * 31536000ULL;
    
    // Calculate the year and find out if it's leap
    year = 1601 + quadricentennials * 400 + centennials * 100 + quadrennials * 4 + annuals;
    leap = !(year % 4) && (year % 100 || !(year % 400));
    
    // Calculate the day of the year and the time
    yday = sec / 86400;
    sec %= 86400;
    hour = sec / 3600;
    sec %= 3600;
    min = sec / 60;
    sec %= 60;
    
    // Calculate the month
    for (mday = month = 1; month < 13; month++)
    {
        if (yday < daysSinceJan1st[leap][month])
        {
            mday += yday - daysSinceJan1st[leap][month - 1];
            break;
        }
    }
    
    // Fill in C's "struct tm"
    memset(pTm, 0, sizeof(*pTm));
    pTm->tm_sec = sec;          // [0,59]
    pTm->tm_min = min;          // [0,59]
    pTm->tm_hour = hour;        // [0,23]
    pTm->tm_mday = mday;        // [1,31]  (day of month)
    pTm->tm_mon = month - 1;    // [0,11]  (month)
    pTm->tm_year = year - 1900; // 70+     (year since 1900)
    pTm->tm_wday = wday;        // [0,6]   (day since Sunday AKA day of week)
    pTm->tm_yday = yday;        // [0,365] (day since January 1st AKA day of year)
    pTm->tm_isdst = -1;         // daylight saving time flag
    
    return pTm;
}

int main(void) {
    uint64_t time = secondNow();
    struct tm pTm;
    secondsSinceEpochToDateTime(&pTm, time);
    char buf[100] = {0};
    
    int num = rand()%1000;   //生成100000内的随机数
    printf("rand num:%4d\n", num);
    
    sprintf(buf, "%02d%02d%02d%02d%02d%04d", 1+pTm.tm_mon, pTm.tm_mday,
            pTm.tm_hour, pTm.tm_min, pTm.tm_sec, num);  //格式化时间和随机数字符串,存放在buf内
    
    printf("guid:%s\n", buf);  //输出guid到控制台
}

 

分享到:
评论

相关推荐

    [C++] C++生成GUID

    ### C++生成GUID详解 #### 一、简介 在软件开发过程中,经常需要为不同的对象或数据赋予一个全局唯一的标识符(Global Unique Identifier,简称GUID)。GUID被广泛应用于多种技术领域,例如COM组件、数据库记录...

    GUID生成源码,可做数据库主键

    在编程语言C++中,可以使用`std::uuids::generate_random`或`std::uuids::nil_generator`函数来生成GUID。在VC++环境中,也可以使用`CoCreateGuid`函数,这是一个COM API,能方便地生成GUID。 接下来,我们谈谈ADO...

    guid生成工具

    用于生成机器的GUID,全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。GUID是一种由算法生成的二进制长度为128位的数字标识符。

    Google C++ Style Guide原文+译文

    《Google C++ Style Guide》是谷歌公司制定的一套C++编程规范,旨在提供一套清晰、一致的代码风格,以提高代码可读性、可维护性和团队协作效率。这份指南覆盖了从命名规则、代码结构、函数设计到异常处理等多个方面...

    更改GUID的小工具

    标题中的“更改GUID的小工具”指的是一个用于修改文件全局唯一标识符(GUID)的应用程序。在计算机编程中,GUID(Globally Unique Identifier)是一种确保在全球范围内唯一标识对象的数字编码,通常由软件开发者用来...

    guid.zip_C# guid 算法_GUID 算法_guid 代码

    在IT行业中,`Guid`(全局唯一标识符,也称为UUID)是一种广泛使用的标识符,特别是在分布式系统和数据库中,因为它能确保在全球范围内生成的每个标识符都是唯一的。`Guid`由128位数字组成,通常以32位十六进制数的...

    GUID.zip_guid_guid 生成器

    标题中的“GUID.zip_guid_guid 生成器”是一个用于创建全局唯一标识符(GUID)的工具,它模拟了Visual Studio(VS)内置的GUID生成功能。GUID,全称Globally Unique Identifier,是一种在大量分布式系统中确保每个...

    GUID生成器 GUID生成小程序

    GUID生成器 GUID生成小程序 快速生成GUID,自动复制到剪贴板。

    Guid生成器(随机生成工具)

    Guid(Globally Unique Identifier)是一种在分布式网络环境中用于唯一标识对象的128位数字。它是微软.NET框架中广泛使用的标识符,特别是在数据库、编程和网络通信中。Guid生成器是一个工具,能够帮助用户快速生成...

    C++获取计算机的CPU ID,硬盘序列号等硬件信息

    在C++编程中,获取计算机的硬件信息,如CPU ID和硬盘序列号,是系统编程的一个重要方面。这些信息对于软件开发、系统诊断以及设备识别等任务非常有用。以下将详细讲解如何通过C++来获取这些硬件信息。 首先,我们要...

    GUID代码生成与算法介绍

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。生成算法用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

    Guid号生成器,可以生成32位Guid号

    Guid(Globally Unique Identifier)是微软提出的一种用于在分布式网络环境中唯一标识对象的编码方式。它由32位十六进制数字组成,通常显示为32个字符,中间用短横线分隔,形成8-4-4-4-12的格式,例如:`12345678-90...

    C++读取注册表中的MachineGuid

    C++读取注册表中的MachineGuid

    生成GUID程序,C#源代码,System.Guid.NewGuid().ToString()全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。

    生成GUID程序,C#源代码,System.Guid.NewGuid().ToString()全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。 GUID...

    华擎主板 1394GUID写入工具

    【华擎主板1394GUID写入工具详解】 在计算机硬件领域,主板是系统的核心,负责连接所有组件并提供必要的通信。华擎主板作为知名的主板制造商,其产品深受用户喜爱。然而,当用户尝试通过编程器刷新主板的BIOS(基本...

    C#获得程序的GUID

    在C#中获取程序的GUID,主要是指获取程序集(Assembly)的GUID,因为每个.NET程序集在编译时都会自动生成一个唯一的GUID,这个信息存储在程序集的元数据中。下面详细介绍如何实现这一操作: 1. **使用AssemblyInfo....

    GUID生成工具源码

    GUID,全称Globally Unique Identifier(全局唯一标识符),在IT领域中广泛用于创建唯一的对象标识。在.NET框架中,C#语言提供了方便的API来生成和操作GUID。本主题将深入探讨GUID生成工具的源码实现及其背后的原理...

    一段用VB生成GUID的代码

    ### VB生成GUID的相关知识点 #### 一、GUID简介 GUID(Globally Unique Identifier),即全局唯一标识符,是一种在时间和空间上具有唯一性的标识符。GUID常用于跨平台、跨语言的应用程序中,用来确保生成的数据...

    GUID生成器,源码

    GUID,全称Globally Unique Identifier,是一种在分布式系统中用于唯一标识对象的128位数字。在Windows操作系统和许多.NET框架相关的技术中,GUID被广泛使用。它确保了在全世界范围内,无论何时何地生成,每一个GUID...

    C++.Templates.-.The.Complete.Guid

    C++.Templates.-.The.Complete.Guid

Global site tag (gtag.js) - Google Analytics