c++ - 从两个 96 位数字生成唯一的 32 位数字
问题描述
为了识别设备,我需要一个唯一编号(32 位)。我正在使用 STM32 微控制器和 NFC 读卡器芯片,它们都提供唯一的 96 位数字
两个 96 位数字都不能缩小偏移,因为供应商不共享 96 位数字的组成——可能是为了识别假冒产品。
对于当前的 MCU,我提取了以下数据:
单片机 1
0-31 位 = 0x410024
32-63 位 = 0x3848500c
64-96 位 = 0
单片机 2
0-31 位 = 0x5f0027
32-63 位 = 0x3848500c
64-96 位 = 0
数据表中的内容描述如下:
0..31 硅晶圆 XY 位置(因此每个单一波动都会在此处重复)
32 晶圆批号
33..96 批号
所以显然上面的两个例子是同一批,同一个晶圆,只是位置不同,这是有道理的,因为它们是从同一个卷轴上取出的
对于 NFC 阅读器,我提取了以下内容
NFC 阅读器
0-31 位 = 0x34471725
32-63 位 = 0x53484835
64-96 位 = 0x38301531
读者对数字是如何组成的信息为零。
我的问题是,是否可以从这两个 96 位数字中生成一个新的唯一 32 位数字。数字可以是任意的,它必须与原始数字没有关系,但应尽可能唯一。
任何意见将是有益的
解决方案
如果有随机的碰撞机会,它的概率会随着每个单元的增加而大致呈指数增长。这被称为生日问题。
对于 100,000 个项目, 给出 0.6878(由Wolfram Alpha提供),即超过 68%。对于 10,000 个项目,它几乎不超过 1%。玩弄这些数字,看看你是否可以冒险。
为了保证结果,我会在设备中添加一个便宜的序列号 EEPROM,例如24AA02UID。
推荐阅读
- c++ - 指向向量和向量的指针中的循环迭代
- android - Android/Kotlin:错误:“期待顶级声明 > 任务:app:buildInfoGeneratorDebug”
- ffmpeg - 获得http请求时是否可以使用ffmpeg将.mp4转换为.ts
- python - Python中素数查找算法的运行时间
- angular - 如何以角度使用网络工作者(ngx-web-worker)?
- ruby - 使用 `Regexp.new` 从字符串中提取子字符串
- ios - 如何在 iOS 应用程序中从 Adobe Lightroom 重现高光和阴影效果
- php - 在 laravel 5.5 中更新订单项
- c# - 使用单一方法维护整个项目的历史记录
- c# - 如何将密码添加到使用 c# 从报表服务器生成的 Excel 文件中?