搜索
bottom↓
回复: 34

如何用一个96位唯一数生成一个48位唯一数?

[复制链接]

出0入0汤圆

发表于 2015-10-8 00:29:58 来自手机 | 显示全部楼层 |阅读模式
设备需要一个48位的ID号,想不到其他办法,现在只能在STM32的ID号下手,但是STM32的ID号是96位的,有没有一种算法可以运用这个唯一的96位ID号,生成另外一个48位的唯一ID号?我想从96位中随机抽取48位,但是不能保证每台抽出来的是不一样的,比较郁闷……

出0入618汤圆

发表于 2015-10-8 00:51:41 | 显示全部楼层
本帖最后由 gzhuli 于 2015-10-8 00:52 编辑

不可能的,只能尽量把冲突几率降到最低,选用的算法要尽量保证输入改变1位输出改变尽可能多的位数。
可以考虑MD5然后截取48位,或者用CRC16 + CRC32组合成48位。

出0入0汤圆

 楼主| 发表于 2015-10-8 01:29:05 来自手机 | 显示全部楼层
gzhuli 发表于 2015-10-8 00:51
不可能的,只能尽量把冲突几率降到最低,选用的算法要尽量保证输入改变1位输出改变尽可能多的位数。
可以考 ...

我想到了,哈哈哈,,96位,就是12个字节,那么我把这12个字节累加或者其他运算方式,那么得出来的肯定是一个唯一整数,然后我把这个整数分解,比如如果我累加出来的是123456,那么我把0X56和ox34和OX12作为48位的低三个字节或者高三个字节,剩余的字节补零……呵呵,,这样可否?

出0入0汤圆

发表于 2015-10-8 01:37:18 | 显示全部楼层
還是最好用2樓的方法,MD5然后截取48位
同一批次的STM32 96位UID非常的接近,可能只差1, 2個bit而太簡單的算法可能會得到一樣的結果

出0入618汤圆

发表于 2015-10-8 01:38:44 | 显示全部楼层
本帖最后由 gzhuli 于 2015-10-8 01:49 编辑
myqiang1990 发表于 2015-10-8 01:29
我想到了,哈哈哈,,96位,就是12个字节,那么我把这12个字节累加或者其他运算方式,那么得出来的肯定是 ...


不可能的,如果96位随便算算就能变成48位,同理48位再算算就可以变成24位,最后96位随便算成1位还是唯一的,你这压缩算法不是天下无敌了?
举例来讲,如果你将0x12345678变成0x1234 + 0x5678 = 0x68AC,那么0x56781234算出来也是0x68AC,0x1236 + 0x5676还是0x68AC,完全没办法保证唯一性的。
在输入数据变化位数很少的情况下,算法越简单冲突的几率越高。MD5等哈希算法是专门设计来对付这类情况的,输入改变1位输出会改变很多位,尽可能保证编码距离最大化,所以还是不要自己重新发明轮子了。

出0入42汤圆

发表于 2015-10-8 06:47:02 来自手机 | 显示全部楼层
大师英明

出90入0汤圆

发表于 2015-10-8 07:28:27 | 显示全部楼层
gzhuli
大师高明

出0入0汤圆

发表于 2015-10-8 08:01:16 | 显示全部楼层
兄弟你想想看,96位数的集合和48位的集合能不能得到一个一一映射呢,明显是不可能的呀,集合元素相差太大了

出0入131汤圆

发表于 2015-10-8 08:02:48 | 显示全部楼层
大师英明,这个帖子让我想到了有人问过,如何 用1个字节来表示2个字节,就是压缩2个字节成1个字节,使用的时候再把1个字节分解成2个字节。。。。这是不可能的

出0入0汤圆

发表于 2015-10-8 08:29:28 | 显示全部楼层
不错,ST要出1位唯一码的片子。

出0入0汤圆

发表于 2015-10-8 08:33:41 | 显示全部楼层
96个房间,每人住一间,硬要搞成48个房间,只能2人住一间了。

出0入0汤圆

发表于 2015-10-8 08:35:03 | 显示全部楼层
不可能,打个比方,你这个产品要用到这个地球上所有的STM32单片机,也就是这个单片机所有可能的ID号都在你的产品里,一共有2的96次方个ID号,你想将96位压缩到48位。最多只会有2的48次方个ID号。所以一定有重复的。你可以采购不同批次的单片机获取ID,然后验证ID号的规律,从中挑选几位做运算,尽量减少相同的概率,这个概率可能会非常小,但不会是0

出0入0汤圆

 楼主| 发表于 2015-10-8 08:35:21 | 显示全部楼层
gzhuli 发表于 2015-10-8 01:38
不可能的,如果96位随便算算就能变成48位,同理48位再算算就可以变成24位,最后96位随便算成1位还是唯一 ...

哦~我明白大师的意思了~~~我昨晚想错了~

出0入57汤圆

发表于 2015-10-8 08:37:32 | 显示全部楼层
之前也考虑过类似问题,主要是利用STM32 ID码生成产品序列号,当时考虑自己做一个简单序列号压缩算法,肯定有重复,但想办法尽量降低重复概率。采用MD5或其他算法不知会增加多少空间,我认为CRC16或32是个好办法。

出0入0汤圆

发表于 2015-10-8 08:39:13 | 显示全部楼层
myqiang1990 发表于 2015-10-8 08:35
哦~我明白大师的意思了~~~我昨晚想错了~

ID加密破解都不用钱了,搞那么复杂干啥

出0入0汤圆

发表于 2015-10-8 08:41:26 | 显示全部楼层
其实异或就可以了,没必要那么复杂

出0入0汤圆

 楼主| 发表于 2015-10-8 08:48:48 | 显示全部楼层
gzhuli 发表于 2015-10-8 01:38
不可能的,如果96位随便算算就能变成48位,同理48位再算算就可以变成24位,最后96位随便算成1位还是唯一 ...

那我就用CRC32试试吧,STM自带这个功能~~

出0入0汤圆

 楼主| 发表于 2015-10-8 08:49:46 | 显示全部楼层
dmxfeng 发表于 2015-10-8 08:39
ID加密破解都不用钱了,搞那么复杂干啥

算了~能用软件解决的~就用软件吧~

出0入0汤圆

发表于 2015-10-8 08:55:39 | 显示全部楼层
直接取最后48位   有重复的这批产品就不用了  这样最简单

出50入0汤圆

发表于 2015-10-8 09:19:32 | 显示全部楼层
只是个ID而已,弄太复杂没大意义,除非你的产品是金融领域使用的。
门禁用ID卡时就取了ID中的最后几个字节,这么做也是有道理的,单个用户重合的概率不高。

出0入0汤圆

发表于 2015-10-8 09:37:36 | 显示全部楼层
找你有事,私个联系方式给我。

出145入215汤圆

发表于 2015-10-8 09:55:11 来自手机 | 显示全部楼层
重新编码就可以,利用时间编码。我就不信你的产品可以用100年

出0入0汤圆

 楼主| 发表于 2015-10-8 10:07:51 | 显示全部楼层
本帖最后由 myqiang1990 于 2015-10-8 10:08 编辑

解决啦~~~谢谢大师们的指导~哈哈哈哈~~就是用STM32,96位ID号通过CRC32运算出一个32位的数据,然后这个4个字节分配给设备ID号,厂商ID号固定就可以了~我的ID号是这样组合得~~算法贴出来~


#define ID_ADDR0   0x1FFFF7E8
#define ID_ADDR1   0x1FFFF7E8
#define ID_ADDR2   0x1FFFF7E8
/*******************************************************************************
*函数原型:void GET_UID(void)
*参数入口:
*参数出口:
*函数说明:
********************************************************************************/
static void RDM_GET_UID(void)
{
        u32 id[3], RDM_UID = 0;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
       
        id[0] = *(u32 *)(ID_ADDR0 + 0);
        id[1] = *(u32 *)(ID_ADDR0 + 4);
        id[2] = *(u32 *)(ID_ADDR0 + 8);
        CRC_ResetDR();
        RDM_UID = CRC_CalcBlockCRC(id, 3);
       
        DEVICE_UID0 = 0x00;
        DEVICE_UID1 = 0x01;
        DEVICE_UID2 = (RDM_UID >> 24) & 0xff;
        DEVICE_UID3 = (RDM_UID >> 16) & 0xff;
        DEVICE_UID4 = (RDM_UID >> 8) & 0xff;
        DEVICE_UID5 = (RDM_UID >> 0) & 0xff;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-10-8 10:24:02 | 显示全部楼层
本帖最后由 gwnpeter 于 2015-10-8 10:25 编辑

直接分成2个数据,进行异或计算,冲突的可能性非常小...........
48bit,也抵得上ipv6了.....................
另外能冲突的设备卖给同一个客户的同一个项目的可能性就更加小了...........................
如果遇到,那是中大奖了...............赶紧买6合彩去

出0入16汤圆

发表于 2015-10-8 11:13:54 | 显示全部楼层
你可以用96位ID加上你内部的序号(如1-100)一起生成ID就安全了,单独用96位生成48位肯定会撞的.

出0入0汤圆

发表于 2017-11-9 15:29:10 | 显示全部楼层
myqiang1990 发表于 2015-10-8 10:07
解决啦~~~谢谢大师们的指导~哈哈哈哈~~就是用STM32,96位ID号通过CRC32运算出一个32位的数据,然后这个4个 ...

楼主的这种计算方法,效果如何呢?重复的几率多大,最近做RDM也遇到了这个问题

出0入0汤圆

发表于 2017-11-9 15:51:14 | 显示全部楼层
看看这个96位的有什么规律吗,如果是生产一个片子加1,那就直接取低48位就好,毕竟2^48是个天文数字,芯片厂家到破产也用不完。

出0入17汤圆

发表于 2017-11-9 16:53:52 | 显示全部楼层
直接取其中的48位就算,不会那么巧合让你买到重号的,而且也发到同一客户手中

出0入0汤圆

发表于 2017-11-16 13:11:13 来自手机 | 显示全部楼层
我就问这么麻烦,为何不用96位的ID。

出0入0汤圆

发表于 2017-11-16 13:56:35 | 显示全部楼层
cock 发表于 2017-11-16 13:11
我就问这么麻烦,为何不用96位的ID。

哈哈,因为RDM协议规定的ID只有6个字节

出0入0汤圆

发表于 2020-7-19 21:48:09 | 显示全部楼层
RDM 取设备ID

出0入0汤圆

发表于 2020-7-27 12:56:53 来自手机 | 显示全部楼层
观摩大佬

出0入25汤圆

发表于 2020-7-27 21:32:44 | 显示全部楼层
96bit , 用最后  48 bit 就好了。   撞库的可能性很小。  除非你的产品是 KKKK级别的量

出0入0汤圆

发表于 2020-7-28 16:17:36 来自手机 | 显示全部楼层
截取最后48位就OK了

出0入0汤圆

发表于 2020-7-28 16:21:48 来自手机 | 显示全部楼层
用Md5对96bit做运算,结果是32位,前面补齐
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 15:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表