因为项目需要, 所以需要使用到一个唯一识别一个硬件的方法。

当然我们知道,目前uuid已经被苹果给禁用。

即如下方法取uuid串。会取得一个40位的串。

UIDevice *myDevice = [UIDevicecurrentDevice];

NSString *deviceUDID = [myDevice uniqueIdentifier];

但因为uuid已被禁用,所以我们只得想其它办法,结果在网上搜到下面这个方法,经验证, 确实可以生成一个唯一的串,但是是32位的,不知是什么东西。但看起来似乎确实是唯一的。 有知道的, 还请留言分享一下,谢谢!

  1. - (NSString *)createUUID
  2. {
  3. // Create universally unique identifier (object)
  4. CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);
  5. // Get the string representation of CFUUID object.
  6. NSString *uuidStr = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject);
  7. // If needed, here is how to get a representation in bytes, returned as a structure
  8. // typedef struct {
  9. //   UInt8 byte0;
  10. //   UInt8 byte1;
  11. //   ...
  12. //   UInt8 byte15;
  13. // } CFUUIDBytes;
  14. CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuidObject);
  15. CFRelease(uuidObject);
  16. return uuidStr;
  17. }

下面是我iphone4的结果

 createUUID=A450EA27-xxxx-xxxx-xxxx-02B752DB82FA,再次运行。发现它是F783E91C-A0DD-4B06-xxxx-CA7967B049EE, 所以可以认为它确实不是唯一的。

 deviceUDID=c96f6d0f9321df1cce375bcf7d6e50fe(末尾去掉8位,呵呵,隐私)


后来在网上搜了一遍, 发现有人说上面这个方法生成的32位串,每次运行都会不一样,经证实,确实是这样子的。
转一下那篇文章在下面:

1.通过调用CFFUUIDCreate函数来生成机器唯一标识符,但每次调用以下函数返回的字符串都不一样,所以第一次调用后需把该字符串存储起来。这是官方API的建议方法

- (NSString *) uniqueString

{

CFUUIDRef unique = CFUUIDCreate(kCFAllocatorDefault);

NSString *result = [(NSString *)CFUUIDCreateString(kCFAllocatorDefault, unique) autorelease];

CFRelease(unique);

return result;

}

2.由于机器的mac地址都不一样,所以可通过获取mac地址后再进行md5加密处理后返回的字符串作为唯一标识码, Heqin:原理就是通过Mac地址,然后再用md5值处理一下,最终成为唯一标识码。个人认为,因为Mac地址本身的唯一性,其实也可以做为唯一识别的身份。(除非有识备没有上网模块,但好像没有这样的设备), 注意:原贴中没有包含下面这几个 include会导致编译失败,需要加上。

#include <sys/socket.h>

#include <sys/sysctl.h>

#include <net/if.h>

#include <net/if_dl.h>

- (NSString *) macaddress{

int                 mib[6];

size_t              len;

char                *buf;

unsigned char       *ptr;

struct if_msghdr    *ifm;

struct sockaddr_dl  *sdl;

mib[0] = CTL_NET;

mib[1] = AF_ROUTE;

mib[2] = 0;

mib[3] = AF_LINK;

mib[4] = NET_RT_IFLIST;

if ((mib[5] = if_nametoindex("en0")) == 0) {

printf("Error: if_nametoindex error\n");

return NULL;

}

if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {

printf("Error: sysctl, take 1\n");

return NULL;

}

if ((buf = malloc(len)) == NULL) {

printf("Could not allocate memory. error!\n");

return NULL;

}

if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {

printf("Error: sysctl, take 2");

return NULL;

}

ifm = (struct if_msghdr *)buf;

sdl = (struct sockaddr_dl *)(ifm + 1);

ptr = (unsigned char *)LLADDR(sdl);

NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",

*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

free(buf);

return outstring;

}

- (NSString *) uniqueGlobalDeviceIdentifier{

NSString *macaddress = [[UIDevice currentDevice] macaddress];

NSString *uniqueIdentifier = [macaddress stringFromMD5];

return uniqueIdentifier;

}

NSString类别 Heqin:下面这个方法需要做如下引用,原贴没有加,会编译通不过:

#import <CommonCrypto/CommonDigest.h>

@implementation NSString(MD5Addition)

- (NSString *) stringFromMD5{

if(self == nil || [self length] == 0)

return nil;

const char *value = [self UTF8String];

unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];

CC_MD5(value, strlen(value), outputBuffer);

NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){

[outputString appendFormat:@"%02x",outputBuffer[count]];

}

return [outputString autorelease];

转http://blog.163.com/ray_jun/blog/static/1670536422011102744836300/

}

40位UUID, 及一个32位的不知是啥相关推荐

  1. 64位系统下一个32位的程序究竟可以申请到多少内存?

    64位系统下一个32位的程序究竟可以申请到多少内存? cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设 ...

  2. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数

    给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数.            1.在文件中至少存在这样一个数?            2.如果有足够的内存,如何处理? ...

  3. java uuid 32_Java生成32位UUID

    import java.net.InetAddress; public class UUIDGenerator { /** * 产生一个32位的UUID * * @return */ public s ...

  4. 给定一个32位有符号整数,将整数中的数字进行翻转

    给定一个32位有符号整数,将整数中的数字进行翻转 解题思路就是不断的求模,然后取余,然后注意溢出问题: 代码: #include<stdlib.h> #include<stdio.h ...

  5. 每日一题(38)—— 一个32位的机器,该机器的指针是多少位?

    一个32位的机器,该机器的指针是多少位? 指针是多少位只要看地址总线的位数就行了.80386以后的机子都是32的数据总线.所以指针的位数就是4个字节了.

  6. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

  7. 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)

    在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C .所以根据 OX1C-0X18=0X04 就知道BSRR是32位寄存器了.因为一 ...

  8. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

  9. 计算一个 32 位无符号整数有多少个位为 1

    http://blog.csdn.net/rappy/article/details/1788969 引用: Counting out the bits     可以很容易的判断一个数是不是2的幂次: ...

  10. 64位的电脑比32位的电脑跑的快么?「多图预警」

    前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...

最新文章

  1. xml 和android脚本之家,Android利用Document实现xml读取和写入操作
  2. 4、kubernetes 集群管理工具 kubectl
  3. Netty笔记(一)第一个程序
  4. bzoj 1468 Tree(点分治模板)
  5. 利用QCustomePlot绘制热力图,瀑布图,频谱色图等
  6. 通过ssl调用远程WebService
  7. eclipse安装lombok插件 ,但是:lombok注解不起作用(亲测有效!)
  8. 阿里安全图灵实验室再次刷新世界顶级算法比赛成绩
  9. LAMP源代码编译整理
  10. xml模块 增删改查
  11. 计算机所有相关系统设置在哪,Win7系统高级设置在哪里 win7系统怎么打开高级设置...
  12. 极速火箭网络助手怎么用_在检测火箭队方面,神经网络比灰烬更好吗? 如果是这样,如何?...
  13. 推荐7款珍藏已久的手机APP,非常实用
  14. 1000: 从今天开始入坑C语言
  15. 信息安全三级易错题总结
  16. 华为nova5里面有用到鸿蒙吗,华为nova7se是不是鸿蒙系统?
  17. linux系统读取plc状态,Linux系统下上位机通讯协议及PLC冗余系统组态-工业支持中心-西门子中国...
  18. Cacheable、CacheEvict、Caching使用示例
  19. 数据可视化路上——中国地图可视化
  20. SQL Server 如何判断PLE (页面的预期寿命)

热门文章

  1. 根据起始时间和结束时间得到期间所有的日期集合
  2. 如何定位web前后台的BUG
  3. avi文件格式详解(三)
  4. android多屏幕多分辨率的一些概念
  5. 四平方和python_成都房价现在多少?和北京差距很大吗?Python爬取了四万套房源!...
  6. flutter: Provider的坑 --- 退出页面时,StatefulWidget又会build一遍?
  7. CommandLineRunner和ApplicationRunner
  8. Unity游戏配置存储方案
  9. Apache2.4 下载和安装 - Win10
  10. Linux学习134 Unit 5