C++生成唯一值的五种方法

目录

1.引言

2.使用标准库中的随机数生成器

3.利用时间戳和计数器组合生成唯一值

4.通过UUID生成唯一值

5.静态或原子变量

6.数据库或外部服务

7.总结


1.引言

        在软件开发中,生成唯一值是一项常见且重要的任务,特别是在需要唯一标识符(如数据库主键、临时文件名、用户会话ID等)的场景中。C++作为一种广泛使用的编程语言,提供了多种生成唯一值的方法。本文将详细介绍三种常用的方法:使用标准库中的随机数生成器、利用时间戳和计数器组合生成唯一值,以及通过UUID(Universally Unique Identifier)生成唯一值。

2.使用标准库中的随机数生成器

        C++11及更高版本的标准库中提供了随机数生成的功能,可以通过这些功能生成唯一值。std::random_device类用于生成一个非确定性随机数,可以作为随机数引擎的种子。而std::mt19937是一个基于梅森旋转算法的伪随机数生成器,具有良好的随机性。

#include <iostream>
#include <random>

int main() {
    // 初始化随机数生成器
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(10000, 99999); // 定义随机数范围

    // 生成一个随机数
    int randomValue = dis(gen);
    std::cout << "Generated Unique Value: " << randomValue << std::endl;

    return 0;
}

上述代码展示了如何使用std::random_devicestd::mt19937生成一个指定范围内的随机整数。这种方法适用于需要生成随机唯一值的场景,但需要注意的是,在高并发环境下可能会生成重复的值。

3.利用时间戳和计数器组合生成唯一值

另一种生成唯一值的方法是利用当前时间戳和一个计数器组合。时间戳保证了值的唯一性(在毫秒级别),而计数器则用于在同一时间戳内生成多个唯一值。


#include <iostream>
#include <chrono>
#include <sstream>
#include <iomanip>

class UniqueIDGenerator {
private:
    static int counter;

public:
    static std::string generate() {
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now();
        auto now_c = std::chrono::system_clock::to_time_t(now);
        std::stringstream ss;
        ss << std::put_time(std::localtime(&now_c), "%Y%m%d%H%M%S");

        // 增加计数器
        counter++;

        // 组合时间戳和计数器生成唯一值
        ss << std::setw(3) << std::setfill('0') << counter;
        return ss.str();
    }
};

int UniqueIDGenerator::counter = 0;

int main() {
    std::cout << "Generated Unique ID: " << UniqueIDGenerator::generate() << std::endl;
    std::cout << "Generated Unique ID: " << UniqueIDGenerator::generate() << std::endl;

    return 0;
}

这种方法在大多数情况下都能生成唯一的值,并且实现起来相对简单。然而,在高并发环境下,如果多个线程或进程同时访问计数器,可能会导致生成的唯一值重复。在实际应用中,可以通过加锁等同步机制来避免这一问题。

4.通过UUID生成唯一值

UUID是一种广泛使用的生成唯一值的方法,它可以生成128位的唯一标识符。在C++中,可以通过Boost库中的UUID功能来生成UUID。

首先,需要安装Boost库。然后,可以使用以下代码生成UUID:

#include <iostream>
#include <boost/uuid/uuid.hpp>            // uuid 类
#include <boost/uuid/uuid_generators.hpp> // 生成器
#include <boost/uuid/uuid_io.hpp>         // 流操作

int main() {
    // 创建一个随机生成器
    boost::uuids::random_generator generator;

    // 生成uuid
    boost::uuids::uuid uuid1 = generator();

    // 输出uuid
    std::cout << uuid1 << std::endl;

    return 0;
}

UUID的唯一性非常高,几乎可以保证在全球范围内的唯一性。这种方法适用于需要高度唯一性的场景,如分布式系统中的唯一标识符。

5.静态或原子变量

对于简单的需求,如类实例的唯一ID,可以使用静态或原子变量。

#include <atomic>  
#include <iostream>  
  
class MyClass {  
private:  
    static std::atomic<int> uniqueId;  
    int id;  
  
public:  
    MyClass() : id(uniqueId++) {}  
  
    int getId() const { return id; }  
  
    static void resetUniqueId() { uniqueId = 0; }  
};  
  
std::atomic<int> MyClass::uniqueId(0);  
  
int main() {  
    MyClass obj1, obj2;  
    std::cout << "Obj1 ID: " << obj1.getId() << std::endl;  
    std::cout << "Obj2 ID: " << obj2.getId() << std::endl;  
}

6.数据库或外部服务

        对于需要跨多个应用或系统保持唯一性的场景,可以考虑使用数据库的自增ID或外部服务(如Redis的INCR命令)来生成唯一值。

7.总结

        生成唯一值是软件开发中的一项重要任务,C++提供了多种实现方法。使用标准库中的随机数生成器可以生成随机唯一值,但在高并发环境下可能重复。利用时间戳和计数器组合生成唯一值简单有效,但在多线程环境下需要同步机制。通过UUID生成唯一值具有高度唯一性,适用于分布式系统等场景。在实际应用中,应根据具体需求和环境选择合适的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Weblogic部署

要安装weblogic&#xff0c;首先要有java环境&#xff0c;因此需要先安装jdk。 这里需要注意&#xff0c;weblogic版本不同&#xff0c;对应的jdk版本也不同&#xff0c;我在这里就踩了很多坑&#xff0c;我这里下载的是fmw_12.2.1.4.0_wls_lite_generic.jar对应的是jdk-8u333…

visual prompt tuning和visual instruction tuning

visual prompt tuning&#xff1a;作为一种微调手段&#xff0c;其目的是节省参数量&#xff0c;训练时需要优化的参数量小。 输入&#xff1a;视觉信息image token可学习的prompt token 处理任务&#xff1a;比如常见的分类任务 visual prompt tuning visual instruction tu…

唯徳知识产权管理系统 DownloadFileWordTemplate 文件读取漏洞复现

0x01 产品简介 唯徳知识产权管理系统,由深圳市唯德科创信息有限公司精心打造,旨在为企业及代理机构提供全方位、高效、安全的知识产权管理解决方案。该系统集成了专利、商标、版权等知识产权的全面管理功能,并通过云平台实现远程在线办公,提升工作效率。是一款集知识产权申…

客户说了算!精益产品开发,让中小企业精准触达用户需求!——张驰咨询

随着全球经济环境的波动&#xff0c;特别是疫情后经济复苏进程的反复&#xff0c;很多中小制造企业面临产品滞销、同质化严重和内卷竞争加剧的困境。市场饱和、利润微薄&#xff0c;还在新产品开发上遇到了研发人才不足、资金短缺等问题。许多企业在这场市场博弈中徘徊在生死边…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

关于报表新入职及进阶培训入口教程

关于报表新入职及进阶培训入口教程 一、网站二、登陆三、报名入口四、缴费及注意事项1. 报名2. 注意事项 五、学习1.在首页时&#xff0c;可以点个人中心进入学习。2.进入后&#xff0c;可以进入如下步骤。 六、完 一、网站 教育事业统计在线培训 二、登陆 注&#xff1a;如果…

C++速通LeetCode简单第17题-爬楼梯(全网最简单)

思路要点&#xff1a;将问题转化为求斐波那契数列的第n项&#xff0c;然后迭代。 思路分析&#xff1a;最后一次爬的阶数不是1就是2&#xff0c;假设爬n阶的方法数是f(n)&#xff0c;假设最后一次爬1阶&#xff0c;那么爬前面的 n-1阶的方法数是f(n-1)&#xff1b;假设最后一次…

20240911泰山杯初赛--temp

Wireshark打开temp.pcap流量包&#xff0c;发现有很多ICMP协议包。 一些ICMP数据包较大&#xff0c;且可发现&#xff0c;明显在传输HTTP协议数据内容&#xff1a; 右键&#xff0c;【显示分组字节】&#xff0c;进一步分析这些HTTP数据&#xff1a; GET /test.html HTTP/1.…

C盘清理不能偷懒!用这方法快速清理10G以上垃圾 操作简单又安全

C盘清理不能偷懒&#xff01;用这方法快速清理10G以上垃圾 操作简单又安全。到现在为止&#xff0c;还有很多的人不知道怎么清理C盘&#xff0c;主要是因为Windows操作系统相对复杂&#xff0c;其文件管理和存储结构对于非专业人士来说可能难以理解。许多用户可能不清楚哪些文件…

重磅!WOS、Scopus数据库相继更新,多本期刊被剔除(附下载)

关注GZH【欧亚科睿学术】&#xff0c;一键获取最新期刊目录列表 节后首天&#xff0c;科睿唯安及爱思唯尔相继更新了数据库&#xff0c;小编给大家总结了各数据库的期刊变动情况&#xff0c;供大家参考。详情如下&#xff1a; 01 SCIE/SSCI目录更新 2024年9月17日&#xff0c…

计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

选题背景‌&#xff1a; 随着城市化进程的加快&#xff0c;公共交通成为城市居民出行的重要方式。然而&#xff0c;传统的公交站点线路查询方式往往依赖于纸质地图或简单的电子显示屏&#xff0c;查询效率低下且信息更新不及时。因此&#xff0c;开发一个功能全面、易于使用的…

【SQL】百题计划:SQL对于空值的比较判断。

[SQL]百题计划 方法&#xff1a; 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而&#xff0c;这个查询只会返回一个结果&#xff1a;Zach&#xff0c;尽管事实上有 4 个…

MAGDA:多智能体指南驱动的诊断助手

MAGDA&#xff1a;多智能体指南驱动的诊断助手 秒懂大纲提出背景精细拆解输入输出全流程创意视角中文意译 论文&#xff1a;MAGDA: Multi-agent guideline-driven diagnostic assistance 秒懂大纲 ├── MAGDA: Multi-agent guideline-driven diagnostic assistance【研究主…

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…

教程 | ArcGIS Pro如何自动保存数据编辑内容

目录 1、工程自动保存 2、数据编辑自动保存 世界上最痛苦的事情就是&#xff1a; 软件崩溃&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 电脑死机&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 突然断电&#xff0c;我没保存&#xff01;&…

【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑

目录 &#x1f378;前言 &#x1f37b;一、台式电脑基本组成 &#x1f37a;二、组装 &#x1f379;三、安装系统 &#x1f44b;四、系统设置 &#x1f440;五、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上篇文章分享了在平时开发的时候遇到的一种项目整合情况&…

如何关闭前端Chrome的debugger反调试

1、禁用浏览器断点 2. 把控制台独立一个窗口

GitLab CI_CD 从入门到实战笔记

第1章 认识GitLab CI/CD 1.3 GitLab CI/CD的几个基本概念 GitLab CI/CD由以下两部分构成。 &#xff08;1&#xff09;运行流水线的环境。它是由GitLab Runner提供的&#xff0c;这是一个由GitLab开发的开源软件包&#xff0c;要搭建GitLab CI/CD就必须安装它&#xff0c;因…

基于springboot+vue实现的智能垃圾分类系统 (源码+L文+ppt)4-063

摘 要 本论文主要完成不同用户的权限划分&#xff0c;不同用户具有不同权限的操作功能&#xff0c;系统包括用户、物业和管理员模块&#xff0c;主要功能有用户、物业、垃圾站点、垃圾投放、验收信息、积分商城、积分充值、通知物业等管理操作。 关键词&#xff1a;智能垃圾…

零基础小白能学网络安全吗?

最近看到很多朋友都在问“零基础能学网络安全吗&#xff1f;” 今天整一篇帮大家分析一下&#xff0c;希望对你有帮助。 首先&#xff0c;问出这个问题的朋友&#xff0c;我大致判断一下&#xff0c;你对网络安全并不了解&#xff0c;只是单纯看到某个视频某篇文章&#xff0…