Linux生成UUID的算法方式(序列号C/C++代码实现)

2023-11-15

Linux中想获取机器的唯一标识(UUID),只需要在命令行中输入uuid就可以看到类似格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)机器标识,通过该唯一标识生成注册码/序列号。有了设备的唯一编号,我们就可以实现更好的软件的授权机制,还可以利用它来限制客户端软件访问后台服务的权限,从而提高系统的安全性。

使用UUID 的目的


使用 UUID 的主要原因之一是不需要集中权限来管理它们(尽管一种格式使用 IEEE 802 节点标识符,其他格式则不使用)。因此,按需 生成可以完全自动化,并用于各种目的。。。

生成 UUID 的几种算法

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

1.利用 802 MAC 地址的唯一值来保证唯一性。
2.种使用伪随机数生成器。
3.种使用加密哈希和应用程序提供的文本字符串。
4.当前日期和时间。

因此,根据此处的机制 生成的 UUID 将与所有其他已分配或将要分配的 UUID 不同。

UUID 字符串表示的正式定义
UUID 根据以下算法生成:

time_low 字段设置为以相同的重要性顺序等于时间戳的最低有效 32 位(位 0 到 31)。
time_mid 字段设置为等于时间戳中的第 32 位到第 47 位。
time_hi_and_version 字段的 12 个最低有效位(位 0 到 11)设置为等于时间戳中的位 48 到 59,以相同的重要性顺序。
time_hi_and_version 字段的四个最高有效位(位 12 到 15)设置为与正在创建的 UUID 版本对应的 4 位版本号。
clock_seq_low 字段设置为8 个最低有效位(位 0 到 7)的时钟序列以相同的重要性顺序。
clock_seq_hi_and_reserved 字段的6 个最低有效位(0 到5 位)设置为时钟序列的6 个最高有效位(8 到13 位)。
clock_seq_hi_and_reserved 的两个最高有效位(位6 和7)分别设置为零和一。
将节点字段设置为 48 位 IEEE 地址,其重要性顺序与地址相同。

什么是 machine-id


man 手册译文是这样讲的:

etc/machine-id 文件包含一个 在安装或首次启动操作系统时生成的、专属于本系统的、独一无二的"machine ID"。 "machine ID"是一个32字符长度的十六进制小写字母字符串,并以换行符结尾。 其本质是一个128位二进制整数的16进制表示。 注意,"machine ID"不能为全零值。

在这里插入图片描述

“machine ID"通常在系统安装或首次启动时从一个随机数源生成, 并且之后无论经过多少次开关机,也一直保持不变。 另一方面,对于无状态系统,如果有必要,将在系统启动的早期自动随机生成一个"machine ID”。

每台机器都应该具有一个独一无二的非空"machine ID"。 为了达到这个目标,可以使用多种不同的方法初始化 /etc/machine-id 文件。一般来说, /etc/machine-id 应该 在操作系统安装过程中完成初始化。

linux 的uuid码

linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。其实,random目录,里面还有很多其它文件,都与生成uuid有关系的。

基于当前时间的 UUID

..
int main (int argc, char **argv) {
  
  ...

	struct timeval tv0;
	gettimeofday(&tv0, NULL);
	time_t t0 = (time_t)tv0.tv_sec;
	struct tm *tm0 = gmtime(&t0);
	char buffer[33];
	// 00000000-yyyy-mmmm-dddd-hhhhhhnnnnnn
	srand((unsigned int)tv0.tv_usec/100);
	sprintf(buffer,"%04x%02x%02x%04x%06x%06x%02x%02x%02x",
		(int)tm0->tm_year+1900, (int)tm0->tm_mon, (int)tm0->tm_mday, 0,
		(int)tv0.tv_sec, (int)tv0.tv_usec, rand()%255, rand()%255, rand()%255);
	
	...

	return 0;
}

在这里插入图片描述

uuidtime 是一个 Linux 程序,用于生成基于当前时间的 UUID自纪元(1970)以来的秒数和微秒数。当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

UUID的弊端


如果将一台机器的UUID拷贝到另一台机器,就类似修改Mac地址的方法达到欺骗的目的。

根据型号和 MAC 地址的低 24 位构建序列号

int get_sn(char *iface, int model_id, unsigned int *si)
{
	unsigned char mac_address[6];
	unsigned char sn[4] = {0};
	struct ifreq ifr;

	assert(iface);
	assert(si);

	int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
	if (sock == -1) {
		fprintf(stderr, "couldn't create socket\n");
		return -1;
	};

	strcpy(ifr.ifr_name, iface);
	if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0) {
		fprintf(stderr, "couldn't ioctl iface: %s\n",
		        ifr.ifr_name);
		return -1;
	}

	if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
		memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
		memcpy(sn, &mac_address[3], 3);

		*si = sn[2] + 256 * sn[1] + 65536 * sn[0];
		*si = *si / 4 - 64;
		*si = *si + model_id;
		return 0;
	}
	return -1;
}

运行结果:
在这里插入图片描述

总结

UUID 是通用唯一识别码。由 32 位 16 进制数字组成,可以是纯 32 位 16 进制数字,也可以包含连接线(形式为 8-4-4-4-12),更新详细信息请参考RFC4122。

欢迎关注微信公众号【程序猿编码】,需要 UUID完整源码 的添加本人微信号(c17865354792)

参考:RFC 4122

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux生成UUID的算法方式(序列号C/C++代码实现) 的相关文章

  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触

随机推荐

  • php加密自定义版权,分享几种好用的PHP自定义加密函数(可逆/不可逆)

    项目中有时我们需要使用PHP将特定的信息进行加密 也就是通过加密算法生成一个加密字符串 这些加密后的字符串可以通过解密算法进行解密 便于程序对解密后的信息进行处理 最常见的应用在用户登录以及一些API数据交换的场景 最常见的应用在用户登录以
  • 计算机网络——拥塞控制(1)

    1 拥塞 congestion 当过多的包在网络缓冲区中竞争某个相同链路时 队列会溢出丢包 当这种丢包成为普通事件时 则称网络发生拥塞 简单概述就是对聚合带宽的需求超过了链路的可用容量 1 1 产生原因 宏观原因 网络资源分布不均匀 流量分
  • postman报错:There was an error in evaluating the test script: JSONError: Unexpected token 'n' at 1:15

    1 There was an error in evaluating the test script JSONError Unexpected token n at 1 15 20200509150938nZ5W 原因 格式错误 获取返回数
  • git tag 打标签常用命令

    git tag 查看标签列表 git tag a V1 6 5 m 新增了OCV等 打标签 git show V1 6 5 查看标签详细 git push origin V1 6 5 推送到远程仓库 git tag d V1 6 5 删除标
  • PGP软件的使用实验报告

    PGP软件的使用 一 实验目的 二 实验环境 三 实验原理 四 实验步骤及结果 五 实验总结 一 实验目的 1 通过认识PGP加密过程 加深对加密理论的理解 2 学会使用PGP软件对文件和电子邮件加密 二 实验环境 PC机至少2台 组建成局
  • 数据结构之实现无向图的广度优先搜索算法

    include
  • Spring揭秘 学习笔记一 (Spring的IoC容器 一)

    Spring框架为POJO提供的各种服务共同组成了Spring的生命之树 如图1 1所示 第2章 IoC的基本概念 2 1 IoC全称为Inversion of Control 中文通常翻译为 控制反转 它还有一个别名叫做依赖注入 Depe
  • Docker部署Prometheus

    组件介绍 Prometheus Server 普罗米修斯的主服务器 node exporter 用于机器系统数据收集 mysqld exporter 用于MySQL数据库数据收集 Cadvisor 用于收集宿主机上的docker容器数据 G
  • mysql group by cube_group by、grouping sets、with rollup、with cube方法

    场景 在编写报表的 sql 脚本的时候 可能会遇到多维度组合的情况 例如下面的情况 常规的做法是编写不同维度组合的 sql 然后再使用 union all 进行全集 当分组维度数量比较多的时候 union的sql代码会非常长 但你若熟悉下面
  • SSLv3 存在严重设计缺陷漏洞,整改方法

    发现此问题后 进入WINDOWS注册表 然后修改 注册表进入 HKey Local Machine System CurrentControlSet Control SecurityProviders SCHANNEL Protocols
  • scel转txt抽取词库

    最近需要词库来优化分词效果 找到了有大神写好的能将搜狗词库scel转成txt的python脚本 http blog csdn net zhangzhenhu article details 7014271 实际运行时因为python版本不同
  • Linux常用指令总结

    一 基础指令 1 ls 列出当前路径下的所有文件和目录的名称 ls l 以列表的形式展现所有 ls a 显示隐藏文件 ls h 将列出的文件大小以可读性较好的方式显示 默认单位为字节 文件大小过大 会以合适的单位来进行转化 但必须和 l 一
  • C++之对封装、继承、多态的理解

    目录 一 对封装 继承和多态的简单理解 二 举例 1 封装的例子 2 继承的例子 3 多态的例子 三 代码实现 1 封装 C 或Java实现 2 继承 C 或Java实现 3 多态 C 或Java实现 四 以一个简单的实例 剖析 封装 的实
  • C++ 按日期时间生成文件

    C 按日期时间生成文件 在日常开发环境中 需要按照时间去命名文件名 因此需要创建如年 月 日此类的字符串 这里给出例子 定义时间命名字符串的格式 enum FileNameStyle example 2022 07 11 14 54 27
  • 解决MSBUILD : error MSB3428错误

    问题 MSBUILD error MSB3428 未能加载 Visual C 组件 VCBuild exe 要解决此问题 1 安装 NET Framework 2 0 SDK 2 安装 Microsoft Visual Studio 200
  • java大津法确定阈值,大津法(最大类间阈值法)

    大津法又叫最大类间方差法 最大类间阈值法 OTSU 它的基本思想是 用一个阈值将图像中的数据分为两类 一类中图像的像素点的灰度均小于这个阈值 另一类中的图像的像素点的灰度均大于或者等于该阈值 如果这两个类中像素点的灰度的方差越大 说明获取到
  • tkinter批量循环创建按钮

    CourseList res courseList button list sy 20 for i in range len CourseList CourseList i CourseList i courseName CourseLis
  • 实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

    文章目录 1 前言 2 本地文件服务器搭建 2 1 python的安装和设置 2 2 cpolar的安装和注册 3 本地文件服务器的发布 3 1 Cpolar云端设置 3 2 Cpolar本地设置 4 公网访问测试 5 结语 1 前言 数据
  • Linux系统常用命令解读

    测试常用Linux进行得一些操作 查看日志 定位问题原因 修改配置文件中的一些配置进行测试 例如开关 文件存放路径 修改定时任务时间 查看服务器性能 远程登录工具 xshell winSCPC ll ls l 会列出该文件下的所有文件 文件
  • Linux生成UUID的算法方式(序列号C/C++代码实现)

    Linux中想获取机器的唯一标识 UUID 只需要在命令行中输入uuid就可以看到类似格式为 xxxxxxxx xxxx xxxx xxxxxxxxxxxxxxxx 8 4 4 16 机器标识 通过该唯一标识生成注册码 序列号 有了设备的唯