精华内容
下载资源
问答
  • SQL 唯一标识 写法

    2019-10-02 07:32:24
    创建唯一标识的方法~16位唯一标识 SELECT LTRIM(STR(CONVERT(varchar(100), GETDATE(), 112)))+right(cast(power(10,6) as varchar)+ISNULL( SUBSTRING(MAX(W_ID),9,6)+1,1),6)+right(cast(power(10,6)as varchar)+...

    创建唯一标识的方法~16位唯一标识

    SELECT LTRIM(STR(CONVERT(varchar(100), GETDATE(), 112)))+right(cast(power(10,6)
    as varchar)+ISNULL( SUBSTRING(MAX(W_ID),9,6)+1,1),6)+right(cast(power(10,6)
    as varchar)+datepart(Second,getdate()),2)FROM W_INFO
    WHERE CONVERT(varchar(100), INSERT_DATE, 112) = CONVERT(varchar(100), GETDATE(), 112)

    示例:2014032500000125

     

    SELECT LTRIM(STR(CONVERT(varchar(100), GETDATE(), 12)))+right(cast(power(10,8)
    as varchar)+ISNULL( SUBSTRING(MAX(USER_MSG_ID),7,8)+1,1),8)+right(cast(power(10,8)
    as varchar)+datepart(Second,getdate()),2)FROM USER_MSG
    WHERE CONVERT(varchar(100), INSERT_DATE, 12) = CONVERT(varchar(100), GETDATE(), 12)

    示例:1403250000000124

    转载于:https://www.cnblogs.com/90nice/p/3453035.html

    展开全文
  • iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义? [摘要:1、UDID (Unique Device Identifier) UDID的齐称是Unique Device Identifier,望文生义,它便是苹果IOS装备的独一辨认码,它由40个...

    http://www.ithao123.cn/content-8688001.html


    iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

    [摘要:1、UDID (Unique Device Identifier) UDID的齐称是Unique Device Identifier,望文生义,它便是苹果IOS装备的独一辨认码,它由40个字符的字母战数字构成。正在良多须要限定] 

    一、UDID (Unique Device Identifier)

    	UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。在很多需要限制一台设备一个账号的应用中经常会用到。在iOS5中可以获取到设备的UDID,后来被苹果禁止了。

    二、UUID(Universally Unique Identifier)

    	UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。
    	开发者可以在应用第一次启动时调用一 次,然后将该串存储起来,替代UDID来使用。但是,如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备。使用UUID,就要考虑应用被删除后再重新安装时的处理。一个解决的办法是:UUID一般只生成一次,保存在iOS系统里面,如果应用删除了,重装应用之后它的UUID还是一样的,除非系统重置 。但是不能保证在以后的系统升级后还能用(如果系统保存了该信息就能用)。

    三、MAC Address

    用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。其中,前三个字节是由IEEE的注册管理机构 RA负责给不同厂家分配的代码(高位24位),也称为“编制上唯一的标识符” (Organizationally Unique Identifier),后三个字节(低位24位)由各厂家自行指派给生产的适配器接口,称为扩展标识符(唯一性)。

    MAC地址在网络上用来区分设备的唯一性,接入网络的设备都有一个MAC地址,他们肯定都是不同的,是唯一的。一部iPhone上可能有多个MAC地址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一个WIFI的,因此只需获取WIFI的MAC地址就好了,也就是en0的地址。
    MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。这样就可以非常好的标识设备唯一性,类似与苹果设备的UDID号,通常的用途有:1)用于一些统计与分析目的,利用用户的操作习惯和数据更好的规划产品;2)作为用户ID来唯一识别用户,可以用游客身份使用app又能在服务器端保存相应的信息,省去用户名、密码等注册过程。
    使用Mac地址生成设备的唯一标识主要分三种:
    1、直接使用“MAC Address” 
    2、使用“MD5(MAC Address)”
    3、使用“MD5(Mac Address+bundle_id)”获得“机器+应用”的唯一标识(bundle_id 是应用的唯一标识)
    在iOS7之后,如果请求Mac地址都会返回一个固定值。

    四、IDFA(identifierForIdentifier

    广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等。

    	是iOS 6中另外一个新的方法,提供了一个方法advertisingIdentifier,通过调用该方法会返回一个NSUUID实例,最后可以获得一个UUID,由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广 告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。

    在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了。

    注意:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户。

    代码:

    #import <AdSupport/AdSupport.h>
    
      NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

    五、IDFV(identifierForVendor

    Vindor标示符,适用于对内:例如分析用户在应用内的行为等。

    是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的DNS反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.somecompany.appone,com.somecompany.apptwo 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。

    注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。

    代码:

      NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    六、OPEN UDID

    	每台iOS设备的OpenUDID是通过第一个带有OpenUDID SDK包的App生成,如果你完全删除全部带有OpenUDID SDK包的App(比如恢复系统等),那么OpenUDID会重新生成,而且和之前的值会不同,相当于新设备;
    	优点是没有用到MAC地址;不同设备能够获取各自唯一的识别码,保证了唯一性,可以用于以往UDID的相关用途;从代码分析OpenUDID的获取,识别码获取方便并且保存谨慎。缺点是当将设备上所有使用了OpenUDID方案的应用程序删除,且设备关机重启,xcode彻底清除并重启,重装应用程序去获取OpenUDID,此时OpenUDID变化,与之前不一样了,所有OpenUDID应用卸载后,由UIPasteboard保存的数据即被清除,重装故会重新获取新的OpenUDID。

    那么当因为用户干预或者恶意程序,致使UIPasteboard数据清除,从而导致OpenUDID被删除,重装也会获取新的OpenUDID。

    OpenUDID生成唯一识别码的代码:

    1. unsigned char result[16];  
    2.         const charchar *cStr = [[[NSProcessInfo processInfo] globallyUniqueString] UTF8String];  
    3.         CC_MD5( cStr, strlen(cStr), result );  
    4.         _openUDID = [NSString stringWithFormat:  
    5.                      @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%08x",  
    6.                      result[0], result[1], result[2], result[3],   
    7.                      result[4], result[5], result[6], result[7],  
    8.                      result[8], result[9], result[10], result[11],  
    9.                      result[12], result[13], result[14], result[15],  
    10.                      arc4random() % 4294967295]; 
    展开全文
  • 各种获取设备唯一标识的方法介绍

    万次阅读 2017-07-25 14:32:26
    UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0...

    //现在苹果对隐私方面很严  很难获取一种较好的设备唯一标识符方法,下面几篇博文仅做参考:

    使用UUID作为手机唯一标识符在app删除并重新安装后会重新生成。当我们把第一次生成的UUID保存到KeyChain中就能解决这个问题。 
    推荐大家使用SFHFKeychainUtils来操作keychain。 
    SFHFKeychainUtils的下载链接http://download.csdn.net/detail/u011173536/9452292

    NSString *SERVICE_NAME = @"com.-----";//最好用程序的bundle id
    NSString * str =  [SFHFKeychainUtils getPasswordForUsername:@"UUID" andServiceName:SERVICE_NAME error:nil];  // 从keychain获取数据
        if ([str length]<=0)
        {
            str  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];  // 保存UUID作为手机唯一标识符
            [SFHFKeychainUtils storeUsername:@"UUID"
                                 andPassword:str
                              forServiceName:SERVICE_NAME
                              updateExisting:1
                                       error:nil];  // 往keychain添加数据

     

    一.UDID(Unique Device Identifier)

    UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueIdentifier方法获取设备的UDID,iOS5以下是可以用的。苹果从iOS5开始就移除了通过代码访问UDID的权限。从2013年5月1日起,试图访问UIDIDs的程序将不再被审核通过,替代的方案是开发者应该使用“在ios 6中介绍的Vendor或Advertising标示符”。所以UDID是绝对是不能再使用了。

    //UUID , 已废除
    NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];
    • 1
    • 2
    • 1
    • 2

    为什么苹果反对开发人员使用UDID? 
    iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。 许多开发者把UDID跟用户的真实姓名、密码、住址、其它数据关联起来;网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据。同时大部分应用确实在频繁传输UDID和私人信息。 为了避免集体诉讼,苹果最终决定在iOS 5 的时候,将这一惯例废除,开发者被引导生成一个唯一的标识符,只能检测应用程序,其他的信息不提供。现在应用试图获取UDID已被禁止且不允许上架。

    二.UUID(Universally Unique Identifier)

    UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。 
    获得的UUID值系统没有存储, 而且每次调用得到UUID,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

    1.CFUUID

    从iOS2.0开始,CFUUID就已经出现了。它是CoreFoundatio包的一部分,因此API属于C语言风格。CFUUIDCreate 方法用来创建CFUUIDRef,并且可以获得一个相应的NSString,如下代码:

    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    • 1
    • 1

    获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

    2.NSUUID

    NSUUID在iOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

    NSString *uuid = [[NSUUID UUID] UUIDString];
    • 1
    • 1

    跟CFUUID一样,这个值系统也不会存储,每次调用的时候都会获得一个新的唯一标示符。如果要存储的话,你需要自己存储。在我读取NSUUID时,注意到获取到的这个值跟CFUUID完全一样(不过也可能不一样)

    三.open UDID

    在iOS 5发布时,uniqueIdentifier被弃用了,这引起了广大开发者需要寻找一个可以替代UDID,并且不受苹果控制的方案。由此OpenUDID成为了当时使用最广泛的开源UDID替代方案。OpenUDID在工程中实现起来非常简单,并且还支持一系列的广告提供商。

    OpenUDID利用了一个非常巧妙的方法在不同程序间存储标示符 — 在粘贴板中用了一个特殊的名称来存储标示符。通过这种方法,别的程序(同样使用了OpenUDID)知道去什么地方获取已经生成的标示符(而不用再生成一个新的)。而且根据贡献者的代码和方法,和一些开发者的经验,如果把使用了OpenUDID方案的应用全部都删除,再重新获取OpenUDID,此时的OpenUDID就跟以前的不一样。可见,这种方法还是不保险。 
    但是OpenUDID库早已经弃用了, 在其官方的博客中也指明了, 停止维护OpenUDID的原因是为了更好的向苹果的举措靠拢, 还指明了MAC Address不是一个好的选择。

    四.MAC Address

    1.这个MAC地址是指什么?有什么用?

    MAC(Medium/Media Access Control)地址,用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。其中,前三个字节是由IEEE的注册管理机构 RA负责给不同厂家分配的代码(高位24位),也称为“编制上唯一的标识符” (Organizationally Unique Identifier),后三个字节(低位24位)由各厂家自行指派给生产的适配器接口,称为扩展标识符(唯一性)。 
    MAC地址在网络上用来区分设备的唯一性,接入网络的设备都有一个MAC地址,他们肯定都是不同的,是唯一的。一部iPhone上可能有多个MAC地址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一个WIFI的,因此只需获取WIFI的MAC地址就好了,也就是en0的地址。 
    形象的说,MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。这样就可以非常好的标识设备唯一性,类似与苹果设备的UDID号,通常的用途有: 
    1)用于一些统计与分析目的,利用用户的操作习惯和数据更好的规划产品; 
    2)作为用户ID来唯一识别用户,可以用游客身份使用app又能在服务器端保存相应的信息,省去用户名、密码等注册过程。

    2.如何使用Mac地址生成设备的唯一标识呢?

    主要分三种: 
    1、直接使用“MAC Address” 
    2、使用“MD5(MAC Address)” 
    3、使用“MD5(Mac Address+bundle_id)”获得“机器+应用”的唯一标识(bundle_id 是应用的唯一标识)

    iOS7之前,因为Mac地址是唯一的, 一般app开发者会采取第3种方式来识别安装对应app的设备。为什么会使用它?在iOS5之前,都是使用UDID的,后来被禁用。苹果推荐使用UUID 但是也有诸多问题,从而使用MAC地址。而MAC地址跟UDID一样,存在隐私问题,现在苹果新发布的iOS7上,如果请求Mac地址都会返回一个固定值,那么Mac Address+bundle_id这个值大家的设备都变成一致的啦,跟UDID一样相当于被禁用, 所以Mac Address 是不能够被使用为获取设备唯一标识的。

    五.广告标示符(IDFA-identifierForIdentifier)

    广告标示符,在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的。但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了。 
    它是iOS 6中另外一个新的方法,提供了一个方法advertisingIdentifier,通过调用该方法会返回一个NSUUID实例,最后可以获得一个UUID,由系统存储着的。

    #import <AdSupport/AdSupport.h>
        NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    • 1
    • 2
    • 1
    • 2

    不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。 
    关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广 告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。 
    所以IDFA也不可以作为获取唯一标识的方法,来识别用户。

    六.Vendor标示符 (IDFV-identifierForVendor)

    Vendor标示符,是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.taobao.app1, com.taobao.app2 这两个BundleID来说,就属于同一个Vender,共享同一个IDFV的值。和IDFA不同的是,IDFV的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。 
    它是iOS 6中新增的,跟advertisingIdentifier一样,该方法返回的是一个 NSUUID对象,可以获得一个UUID。如果满足条件“相同的一个程序里面-相同的vendor-相同的设备”,那么获取到的这个属性值就不会变。如果是“相同的程序-相同的设备-不同的vendor,或者是相同的程序-不同的设备-无论是否相同的vendor”这样的情况,那么这个值是不会相同的。

        NSString *strIDFV = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    • 1
    • 1

    但是如果用户将属于此Vender的所有App卸载,则IDFV的值会被重置,即再重装此Vender的App,IDFV的值和之前不同。

    七.推送token+bundle_id

    推送token+bundle_id的方法: 
    1、应用中增加推送用来获取token 
    2、获取应用bundle_id 
    3、根据token+bundle_id进行散列运算

    apple push token保证设备唯一,但必须有网络情况下才能工作,该方法并不是依赖于设备本身,而是依赖于apple push机制,所以当苹果push做出改变时, 你获取所谓的唯一标识也就随之失效了。所以此方法还是不可取的。

    八. NSUUID, CFUUID, IDFA, IDFV获取的标识对比

    首次运行

    NSUUID:9D820D3A-4429-4918-97F7-A69588B388A4 
    CFUUID:80F961D0-1E6A-4ECD-A0A9-F58ED858FE20 
    IDFA:687E6A90-50A3-4424-871C-BE255D050AFD 
    IDFV:8E740A99-283B-4F6A-87EF-443FB7778488

    二次运行

    NSUUID:23AB8D3D-4F1D-45E2-8BD7-83B451125326 
    CFUUID:14DDBFCF-67A6-46B7-BB48-4EF2ADC5429F 
    IDFA:687E6A90-50A3-4424-871C-BE255D050AFD 
    IDFV:8E740A99-283B-4F6A-87EF-443FB7778488

    卸载后, 重新安装运行

    NSUUID:BD934F9C-B7EC-4BD1-B65E-964C66537CAB 
    CFUUID:29654DE0-AC93-40F9-98AB-1E10A271AF8D 
    IDFA:687E6A90-50A3-4424-871C-BE255D050AFD 
    IDFV:8E740A99-283B-4F6A-87EF-443FB7778488

    重启后运行

    NSUUID:82711557-3A17-4B82-8F18-09AADF9DD37B 
    CFUUID:FFBC73EC-CFBE-414C-870E-77C0714E0347 
    IDFA:687E6A90-50A3-4424-871C-BE255D050AFD 
    IDFV:8E740A99-283B-4F6A-87EF-443FB7778488

    总结

    说了这么多, 才发现原来没有一种方法是可行的。没错, 其实自从苹果废除UDID后, 就不能达到获取设备真正的唯一标识了。因为这些方法中导致获取的唯一标示产生改变的原因, 或是重新调用方法, 或是重启设备, 或是卸载应用, 或是还原某些标识, 或者刷新系统… 
    所以, 不能达到从根本上获取唯一标识, 我们只能做到尽可能接近。下面是我用过的方法。

    如何正确的获取设备的唯一标识

    我用的方法是将获取的UUID永久存储在设备的KeyChain中, 这个方法在应用第一次启动时, 将获取的UUID存储进KeyChain中, 每次取的时候, 检查本地钥匙串中有没有, 如果没有则需要将获取的UUID存储进去。当你重启设备, 卸载应用再次安装,都不影响, 只是当设备刷机时, KeyChain会清空, 才会消失, 才会失效。 
    不只是这一种方法, 你也可以保存除UUID之外,其他合适的标识, 但利用KeyChain去存储标识的方式应该是最接近的。

    由于苹果对安全的加强,现在通过

    NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    

    获取唯一标示的方法不可行了。 
    需要将唯一标示保存到KeyChain中,这样即便是应用卸载了,然后用户在安装也是获取到的唯一的UUID。

    我封装了一个库,下载地址: 
    http://download.csdn.net/detail/zhuzhiqiang_zhu/9693729

    需要设置的东西: 
    这里写图片描述

    使用起来非常的方便,

        //保存到keychain
        if([AppUntils readUUIDFromKeyChain]){
            [AppUntils saveUUIDToKeyChain];
        }
    

    获取

    NSString *adUuid = [AppUntils readUUIDFromKeyChain];
    

     keyChain + uuid

    方式使用 keyChain + uuid
    1.需要在xcode -> project ->target ->capabilities 中添加 keychain sharing
    2.在项目中添加下面两个文件

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface DeviceId : NSObject
    + (NSString *)getUUIDByKeyChain;
    + (void)save:(NSString*)service data:(id)data;
    + (id)load:(NSString*)service;
    + (void)deleteKeyData:(NSString*)service;
    @end
    
    NS_ASSUME_NONNULL_END
    #import "DeviceId.h"
    #import <UIKit/UIKit.h>
    @implementation DeviceId
    
    
    /**  获取UUID*/
    + (NSString *)getUUIDByKeyChain{
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];//获取app版本信息
        NSString *key = [NSString stringWithFormat:@"%@.uniqueid",[infoDictionary objectForKey:@"CFBundleIdentifier"]];
        NSString*strUUID = (NSString*)[DeviceId load:key];
        if([strUUID isEqualToString:@""]|| !strUUID)
        {
            strUUID = [UIDevice currentDevice].identifierForVendor.UUIDString;
            
            if(strUUID.length ==0 || [strUUID isEqualToString:@"00000000-0000-0000-0000-000000000000"])
            {
                CFUUIDRef uuidRef= CFUUIDCreate(kCFAllocatorDefault);
                strUUID = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));
                CFRelease(uuidRef);
            }
            //将该uuid保存到keychain
            [DeviceId save:key data:strUUID];
        }
        return strUUID;
    }
    
    
    + (NSMutableDictionary*)getKeychainQuery:(NSString*)service {
        return[NSMutableDictionary dictionaryWithObjectsAndKeys:
               (id)kSecClassGenericPassword,(id)kSecClass,
               service,(id)kSecAttrService,
               service,(id)kSecAttrAccount,
               (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
               nil];
    }
     
    + (void)save:(NSString*)service data:(id)data{
        //Get search dictionary
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        //Delete old item before add new item
        SecItemDelete((CFDictionaryRef)keychainQuery);
        //Add new object to searchdictionary(Attention:the data format)
        [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data]forKey:(id)kSecValueData];
        //Add item to keychain with the searchdictionary
        SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
    }
     
    + (id)load:(NSString*)service {
        id ret =nil;
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        //Configure the search setting
        //Since in our simple case we areexpecting only a single attribute to be returned (the password) wecan set the attribute kSecReturnData to kCFBooleanTrue
        [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
        [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
        CFDataRef keyData =NULL;
        if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData) ==noErr){
            @try{
                ret =[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData*)keyData];
            }@catch(NSException *e) {
                NSLog(@"Unarchiveof %@ failed: %@",service, e);
            }@finally{
            }
        }
        if(keyData)
            CFRelease(keyData);
        return ret;
    }
     
    + (void)deleteKeyData:(NSString*)service {
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        SecItemDelete((CFDictionaryRef)keychainQuery);
    }
    @end
        NSString *uuid = [DeviceId getUUIDByKeyChain];
        NSLog(@"uuid = %@",uuid);

    原文链接:  https://www.jianshu.com/p/408977444043

    展开全文
  • 手机设备唯一标识相关概念

    千次阅读 2020-08-21 10:27:14
    手机设备唯一标识相关概念 IMEI 定义IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写。俗称“手机串号”、“手机串码”、“手机序列号”,用于在GSM移动网络中识别每一部独立的手机,...

    手机设备唯一标识相关概念

    IMEI

    定义
    IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写。俗称“手机串号”、“手机串码”、“手机序列号”,用于在GSM移动网络中识别每一部独立的手机,相当于手机的身份证号码。全球每部通过正规渠道销售的GSM手机均有唯一的IMEI码。
    IMEI码适用于GSM和WCDMA制式的移动电话和卫星电话,而CDMA手机采用MEID码,与IMEI码有所区别
    分配机构
    IMEI码由GSMA协会统一规划,并授权各地区组织进行分配,在中国由工业和信息化部电信终端测试技术协会(TAF)负责国内手机的入网认证,其他分配机构包括英国BABT、美国CTIA等。
    组成
    IMEI由15位数字组成,其组成为:

    • 前6位数(TAC,Type Approval Code)是"型号核准号码",一般代表机型。
    • 接着的2位数(FAC,Final Assembly Code)是"最后装配号",一般代表产地。
    • 之后的6位数(SNR)是"串号",一般代表生产顺序号。
    • 最后1位数(SP)通常是"0",为检验码,目前暂备用。

    查看方法
    手机拨号键盘输入*#06#即可查询

    MEID

    定义
    MEID 移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码,也是每台CDMA手机或通讯平板唯一的识别码。
    通过这个识别码,网络端可以对该手机进行跟踪和监管。
    分配机构
    MEID号码是由Telecommunications Industry Association(TIA)进行分配管理的。
    MEID的申请,是需要付费的。价格是每1M范围的MEID的费用是8000美元,每增加1M范围的MEID号码需要额外付费8000美元。
    组成
    在这里插入图片描述

    如图所示,MEID由14个十六进制字符标识,第15位为校验位,不参与空中传输

    • RR:范围A0-FF,由官方分配
    • XXXXXX:范围 000000-FFFFFF,由官方分配
    • ZZZZZZ:范围 000000-FFFFFF,厂商分配给每台终端的流水号
    • C/CD:0-F,校验码

    这些字段被定义为10进制时,有以下格式

    • RR – 有效范围 ’99’, ’98’, ’97’ ,全球统一管理
    • XXXXXX – 有效范围 000000–999999。
    • ZZZZZZ – 有效范围 000000-- 999999。
    • C – 有效范围 0 – 9 – 不参与空中传输

    查看方法
    手机拨号键盘输入*#06#即可查询

    IMSI

    定义
    IMSI(International Mobile Subscriber Identity)国际移动用户识别码,是用于区分蜂窝网络中不同用户的、在所有蜂窝网络中不重复的识别码。在GSMUMTSLTE网络中,IMSI来自SIM卡,在CDMA2000网络中则是直接来自手机,或者RUIM。
    分配机构
    IMSI的格式由国际电信联盟(ITU)的E.212标准定义
    组成
    IMSI由一串十进制数字组成,最大长度为15位。实际使用的IMSI的长度绝大部分都是15位,短于15位的例子少见。
    示例:
    IMSI:310150123456789

    MCC310美国
    MNC150美国电话电报公司(AT&T Mobility)
    MSIN123456789

    IMSI:460001357924680

    MCC460中华人民共和国
    MNC00中国移动
    MSIN1357924680

    UUID

    定义
    UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键,在时间和空间都完全惟一的系统信息。
    UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡MAC地址)等数据计算生成的。UUID可以被任何人独立创建,并按需发布。,因为它们是不会被复制的独特标识符。属性协议允许设备使用UUID识别属性类型,从而不需要用读/写请求来识别它们的本地句柄
    分配机构
    UUID没有集中管理机构
    组成
    UUID是一个128比特的数值,为了提高效率,常用的UUID可缩短至16位。
    采用32位数字组成,编码采用16进制
    UUID的编码规则:

    • 1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;
    • 9~16位采用底层的IP地址,在服务器集群中的惟一性;
    • 17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
    • 25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。

    生成方法
    通常平台会提供生成的API

    GUID

    定义
    全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。
    GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。
    GUID一词有时也专指微软对UUID标准的实现。
    分配机构
    UUID没有集中管理机构
    组成
    GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
    生成方法
    通常平台会提供生成的API

    IDFA

    定义
    IDFA (IdentifierForIdentifier)是苹果 iOS 6 开始新增的广告标识符,在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,可以简单理解为 iPhone 的设备临时身份证
    重置方式

    • 重置系统
    • 设置程序 -> 通用 -> 还原 -> 还原位置与隐私
    • 设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符 -> 重启

    查看方法
    苹果公司提供获取的api接口:

    #import <AdSupport/AdSupport.h>
    [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    

    IDFV

    定义
    IDFV - Identifier For Vendor(应用开发商标识符)Vender是指应用提供商
    给Vender标识用户用的,每个设备上属同一个Vender的应用获取到的值相同。

    • 线上: IDFV 会根据App Store给的数据决定,卸载重装后也一致 (不同设备是不一样的)
    • 开发: 如果不是从App Store安装的,那么会根据bundle ID的前两个字端进行计算,所以 com.example.a 和 com.example.b 在开发阶段计算出来的IDFV 会是一样的.

    重置方式
    (未从App Store 下载时)当 bundle ID为 com.example.? 所有的app卸载之后会重置IDFV
    查看方法

    #import <AdSupport/ASIdentifierManager.h>
    [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
    

    # UDID **定义**
    UDID (Unique Device Identifier)iOS设备的唯一识别码,它由40位16进制数的字母和数字组成
    **重置方式**
    每台iOS设备的UDID是唯一且永远不会改变(除了越狱,没什么办法可以改变它)
    **查看方法** ```objectivec [[UIDevice currentDevice] uniqueIdentifier]; ``` **iOS 5.0 开始废弃,采用改方法获取,审核会被拒.之所以废弃是因为通过UDID可以锁定一台设备,存在一定的风险** # OpenUDID **定义**
    开源组件,每台iOS设备的OpenUDID是通过第一个带有OpenUDID SDK包的App生成,如果你完全删除全部带有OpenUDID SDK包的App(比如恢复系统等),那么OpenUDID会重新生成,而且和之前的值会不同,相当于新设备。
    **优点**
    • 没有用到MAC地址。(注:MAC地址跟UDID一样,存在隐私问题。不能保证以后不会禁用MAC地址。)
    • 不同设备能够获取各自唯一的识别码,保证了唯一性,可以用于以往UDID的相关用途。
    • 当设备上安装第二个使用了OpenUDID方案的应用程序,将会从UIPasteboard中获取唯一识别码,这里取到的就是之前第一个应用保存到UIPasteboard中的。【前提:设备上有一个使用了OpenUDID的应用存在】

    缺点

    • 当将设备上所有使用了OpenUDID方案的应用程序删除,且设备关机重启,xcode彻底清除并重启,重装应用程序去获取OpenUDID,此时OpenUDID变化,与之前不一样。
    • 所有OpenUDID应用卸载后,由UIPasteboard保存的数据即被清除,重装会重新获取新的OpenUDID。
    展开全文
  • 设备唯一标识

    千次阅读 2020-10-30 14:34:53
    International Mobile Equipment Identity,国际移动设备身份码,在手机组装完成后赋予的一个全球唯一的号码,由于此时IPhone只支持单卡,所以IMEI和IPhone是一一对应的 iOS 2提供了一种方法获取IMEI,但是为了保护...
  • 设备的唯一标识

    千次阅读 2013-10-11 15:30:31
    3、使用“MD5(Mac Address+bundle_id)”获得“机器+应用”的唯一标识(bundle_id 是应用的唯一标识)  iOS7之前,因为Mac地址是唯一的 , 一般app开发者会采取第3种方式来识别安装对应app的设备。为什么会...
  • apk唯一识别自己的标志什么

    千次阅读 2016-09-01 12:56:21
    ---------------应用程序的包名问题----------------------------------------------------------- 在...于是查找资料发现: AndroidManifest.xml文件中的 package可以认为是一个应用的唯一标识id ,在建立项目时输
  • Android 设备唯一标识(适配Android版本)

    千次阅读 热门讨论 2020-12-12 10:26:01
      首先要知道设备唯一标识的重要性,它可以做什么? ① 大数据统计,比如采集这个APP的安装量,那么一个唯一标识就代表一个Android设备 ② 放置多设备重复登录,比如QQ、微信,你在A手机登录了,如果又
  • 获取设备的唯一标识符细解

    千次阅读 2018-07-21 22:08:23
    iOS中获取设备唯一标识符的方法随着ios版本的更新而变化,iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的...
  • 我们项目中有一个需求,那就是获取同一用户进行签到时候只能使用一个设备,在17年之前还可以正常使用,最近新增一个手机唯一标识权限打开管理,从而影响了最早之前的逻辑处理在这里专门做一个记录,来警醒自己。...
  • 在iOS系统中,获取设备唯一标识的方法有很多:一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成(越狱的设备通过某些工具...
  • 获取设备唯一标识

    2020-05-22 09:58:35
    苹果系统,可用于识别唯一设备的标识不多,如下图。综合起来,苹果系统生成设备ID的标识符顺序应该是IDFA -> IDFV ->UDID,即先获取IDFA,获取不到在获取IDFV,获取不到IDFV时,再获取UDID,然后使用相关算法...
  • 在做聊天模块的时候,最初的消息唯一标识是msgId,在业务量小的情况下是可以满足需求的,毫秒级的唯一冲突是很难出现的。但是当用户量上升之后,时间戳的这种方案显然不行。因此需要引入一种新的前端生成唯一标识的...
  • iOS获取设备的唯一标识的方法

    千次阅读 2019-09-11 08:43:41
    网上有很多的获取方法,最常用的也是苹果推荐的方法是: NSString *uuid0 = [[[UIDevice current...NSLog(@"--1唯一识别码uuid-->%@", uuid0); 也有文章说: CFUUIDRef puuid = CFUUIDCreate( nil ); ...
  • 关于设备唯一标识

    万次阅读 2015-05-06 11:19:24
    首先结论是令人失望的,对于android来说,这是一个没有完美方案的问题。大家只能努力提高它的准确性,对于大的公司来说,可以自己开发出一套自己的机制,例如我上家...如果目前对设备唯一标志敏感度不高,可以参考友盟
  • Android 应用的唯一标识

    千次阅读 2017-12-26 09:30:53
    在Android中用来区别应用程序的唯一标识到底是什么,在以前一直以为是清单文件中配置的包名即为应用程序的唯一标识。在以前用Eclipse开发应用程序的时候确实包名即为应用程序的ApplicationId即应用程序的唯一标识。...
  • 3、使用“MD5(Mac Address+bundle_id)”获得“机器+应用”的唯一标识(bundle_id 是应用的唯一标识) 在iOS7之后,如果请求Mac地址都会返回一个固定值。 四、IDFA(identifierForIdentifier) 广告标示符,...
  • 关于设备的唯一标识符

    千次阅读 2016-06-01 15:22:09
    UDID是Unique Device Identifier的简称,也就是唯一设备标识意思。于iOS SDK中取得的方法是UIDevice的一个叫uniqueIdentifier的NSString*,由于这个ID字符串是基于设备的,应用开发人员可以通过获取此ID来用于...
  • UUID手机端唯一标识

    千次阅读 2017-04-28 15:47:09
    从字面上来看其实不难理解,正如世界上没有两片完全相同的树叶一样,主要强调的是唯一性。废话不多说,直接上代码 public class UUIDTool{ private static String Sid = null; private static final String ...
  • 数据库的唯一标示符(ID)的选择

    千次阅读 2015-01-03 21:46:33
    在“常识”之中,int型的自增id,字符串类型的uuid,其他与业务相关的唯一键…都是我们作为主键的选择。那么是不是说在一张表中只要能保证值唯一的属性列都可以做为主键或者更合适做主键呢? 那我们首先清晰几...
  • 不同 App 可能通过某些唯一标识符对你进行强制跟踪,广告平台则会通过这个唯一标识符对你进行用户画像描绘,进而共享给相关 App 及其后台,一旦「你」打开了其中的某个 App,那么你就会被识别到——你点了什么、看过...
  • 这解决了在创建可重复使用的Vue组件(可在页面中多次实例化...另外,此插件还会为每个Vue.js组件生成一个唯一的id属性(默认情况下为uid)。 该插件没有外部依赖性。 通过npm安装(节点软件包管理器)$ npm install vue
  • hashCode用于区分不同数据。 显示结果: intDatas[0] .HashCode:-553279680 int_A:11///HashCode:11 int_B:12///HashCode:12 intDatas[1] .... 相关资料: 1.[Unity][数据存储][存档]唯一标识instanceID有啥用 2.
  • APN标识什么意思?CMWAP是什么意思?

    千次阅读 2009-11-23 11:43:00
    APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。 道接入点的设置,很多人就会有...
  • OID是什么意思

    千次阅读 2020-07-14 23:38:56
    OID是什么 在数据库设计中,需要为每一条记录设定key值。key值加上表名,形成了唯一的标志。 在面向对象中,唯一标志的方式是...简单一点说,OID就是对象的唯一标识。 如何存储OID OID有几种存储机制: 一种是使用自增
  • if($_POST){  if(isset($_SESSION['uid'])){  $uid = $_SESSION['uid'] = $_SESSION['uid']+1; --注意复制给自己否则加法不生效将还是加自己,因为$_SESSION['uid']的值未被修改  }else{ ...
  • URL是什么意思 ? URL介绍

    万次阅读 多人点赞 2020-01-09 20:14:18
    Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。 URL URL是对互联网上得到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,683
精华内容 48,273
热门标签
关键字:

唯一标识是什么意思