当前位置: 首页 > article >正文

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.kler.cn/news/304679.html

相关文章:

  • 【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版
  • 前端项目node版本问题导致依赖安装异常的处理办法
  • 网络安全实训七(MSF与CS互相连接)
  • “AI大语言模型+”助力大气科学相关交叉领域实践技术应用
  • ubuntu20.4安装Qt5.15.2
  • SQL案例分析:计算延迟法定退休年龄
  • vue项目如何在js文件中导入assets文件夹下图片
  • SAP B1 营销单据 - 单据字段介绍(中)
  • AI 工具如何提高工作效率
  • 果蔬识别系统性能优化之路(五)
  • Kafka 基于SASL/SCRAM动态认证部署,kafka加账号密码登录部署
  • 树莓派5开发板-安装Raspberry Pi系统-学习记录1
  • 钉钉虚拟位置打卡
  • Gitea Action注册runner
  • vue2,3生命周期
  • C++学习,多态虚函数
  • LeetCode:2390. 从字符串移除*号 使用栈,时间复杂度O(N)
  • 计算机视觉中,Pooling的作用
  • 系统架构师考试学习笔记第五篇——架构设计补充知识(26)论文写作
  • 炫酷HTML蜘蛛侠登录页面
  • CentOS 7官方源停服,配置本机光盘yum源
  • 无人机视角的道路损害数据集,2400张图像,包括纵向裂缝(LC)、横向裂缝(TC)、鳄鱼裂缝(AC)、斜裂(OC)、修补(RP)和坑洞(PH),共2.3GB
  • OpenCV-Python笔记(上)
  • Kubernetes 持续集成与交付(CI/CD)
  • 学习平台|基于java的移动学习平台系统小程序(源码+数据库+文档)
  • UE5 阴影通道
  • 计算机毕业设计 大学志愿填报系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 基于 SpringBoot 的私人健身与教练预约管理系统
  • Git常用命令与基本操作(包括搭建git环境)
  • ResNet(Residual Network)网络介绍