精华内容
下载资源
问答
  • 各种获取设备唯一标识的方法介绍

    万次阅读 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

    展开全文
  • UUID是如何保证唯一性的? 为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素。当然,你要说UUID是不是绝对的不会出现重复的,这个也不能这样说的(我...

    UUID是如何保证唯一性的?

    为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素。当然,你要说UUID是不是绝对的不会出现重复的,这个也不能这样说的(我下面会提到)。
    UUID具有以下涵义:
    经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址时间戳名字空间(Namespace)随机或伪随机数时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
    非人工指定,非人工识别UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。
    在特定的范围内重复的可能性极小UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
    UUID的版本UUID具有多个版本,每个版本的算法不同,应用范围也不同。首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:00000000-0000-0000-0000-000000000000
    UUID Version 1:基于时间的UUID基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。
    UUID Version 2:DCE安全的UUIDDCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
    UUID Version 3:基于名字的UUID(MD5)基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
    UUID Version 4:随机UUID根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
    UUID Version 5:基于名字的UUID(SHA1)和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
    UUID的应用从UUID的不同版本可以看出,Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;至于Version 4,个人的建议是最好不用(虽然它是最简单最方便的)。通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID: 映射类型的对象。比如只有代码及名称的代码表。 人工维护的非系统生成对象。比如系统中的部分基础数据。对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)

    上面这段解析文是知乎一位朋友的理解(https://www.zhihu.com/question/34876910#answer-31004674),个人感觉从UUID的概念、特征描述比较透彻。

    JAVA中UUID的使用

    我们来看看在JAVA中UUID的使用方式:

    查看jdk提供的uuid的api发现。

    uuid 提供了两个方法:randomUUID() 和nameUUIDFromBytes()两个方法。

    其中:randomUUID()是随机(适用于唯一订单号)的。

    nameUUIDFromBytes(byte[] n)会根据n产生唯一的uuid。只要有用户的唯一性信息。就能保证此用户的uuid的唯一性。例如(身份证号等)

    我们更愿意使用自定义唯一编号,再使用该编号生成唯一的UUID。

    我们通过一个非常简单的例子来展示UUID的使用:

    package byron4j.dlzd;
    
    import java.util.UUID;
    public class UuidDemo {
        public static void main(String[] args) {
    
    
            System.out.println(UUID.randomUUID().toString().replace("-", ""));
            System.out.println(UUID.randomUUID().version());
    
                    System.out.println(UUID.nameUUIDFromBytes("890110866094329856".getBytes()).toString().replace("-", ""));
    
    
            System.out.println(UUID.nameUUIDFromBytes("890110866094329856".getBytes()).version());
    
        }
    }
    

    用例输出结果如下:

    d9613ff9975b47e3a8bb1ef3766f7a86
    4
    873473466cf23b5fb988827f8dffbe7d
    3

    我们比较 randomUUID() 和 nameUUIDFromBytes(byte[])方法, 可以得知 其内部使用的是算法版本分别是4、3; 因为我们更趋向于使用版本3、5的算法实现, 所以在实际生产中,推荐使用 nameUUIDFromBytes方法将自身的唯一id转换为UUID形式。

    展开全文
  • 通用唯一标识码UUID的介绍及使用。

    千次阅读 2018-01-10 09:12:56
    UUID全称:Universally Unique Identifier,即通用唯一识别码。 UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = 2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才...

    什么是UUID?

    UUID全称:Universally Unique Identifier,即通用唯一识别码。

    UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = 2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

    UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符,如:550e8400-e29b-41d4-a716-446655440000。

    UUID的作用

    UUID的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。

    UUID的组成

    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

    UUID由以下几部分的组合:

    • 当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

    • 时钟序列。

    • 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

    UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。

    UUID的生成

    public static void main(String[] args) throws Exception {
        System.out.println(UUID.randomUUID());
    }

    批量生成UUID网站:http://www.uuid.online/

    推荐阅读

    干货:2TB架构师四阶段视频教程

    面经:史上最全Java多线程面试题及答案

    面经:史上最全阿里高级Java面试题

    面经:史上最全Spring面试题

    教程:最全Spring Boot全套视频教程

    书籍:进阶Java架构师必看的15本书

    工具:推荐一款在线创作流程图、思维导图软件

    分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

    展开全文
  • 待写

    待写

    展开全文
  • 通用唯一标识码UUID的介绍及使用

    千次阅读 2018-04-11 15:14:31
    UUID全称:Universally Unique Identifier,即通用唯一识别码。 UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = 2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年...
  • 由于我们后台判断App登录时根据唯一标识来判断的在不同终端登录的,如果唯一标识不一样,说明是换了设备,但是我们的用户名密码是我们同一系列的app公用的,所以得保证同一公司旗下的app在同一设备下的唯一标识是同...
  • java.util.UUID通用唯一识别码的介绍

    万次阅读 2015-01-28 09:40:17
    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) ...
  • 文章目录 1、UAVCAN介绍 2、Libuavcan基本框架与提供的机制 1、UAVCAN介绍 UAVCAN是一个开源、轻量级,专为太空宇宙飞船或者是机器人设计的通信框架。它不单单是can通信协议。它其实是Uncomplicated Application-...
  • 本文介绍如何使用 can-utils [1 ]包在 SocketCAN 接口上发送/接收数据。 can-utils 包含一些用于 Linux®SocketCAN 子系统的用户空间实用程序。
  • 获取唯一标识符

    千次阅读 2015-12-27 01:31:54
    一、iOS不同版本获取唯一标识符的方法比较1、iOS 5:UDID(Unique Device Identifier)iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是...
  • 待写
  • 各种获取设备唯一标识的方法介绍, 实现获取唯一标识的最好的方法。
  • 1、功能介绍配置了唯一校验的字段,在录入和编辑页面中,动态查询用户输入值是否存在校验。 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验。2、配置唯一校验登录系统,在线...
  • 基于zookeeper的分布式唯一id生成器

    千次阅读 2018-10-11 16:59:22
    之前已简单介绍过Curator客户端的使用,并利用Curator实现了分布式锁和master选举,文章链接:https://blog.csdn.net/fanrenxiang/article/details/83013218 本文简述分库分表之后分布式下如何保证ID全局唯一性,...
  • Android获取设备唯一ID

    万次阅读 2014-09-19 12:04:14
    Android的开发者在一些特定情况下都...本文提供有关如何读取各种Android设备的 ID的介绍,用以使用标识号。本文假定用户已经安装了Android以及开发应用程序必要的工具。并且,本文假定用户已了解Android的基本知识。
  • 【分布式系统】唯一ID生成策略总结

    千次阅读 多人点赞 2021-01-30 11:55:27
    文章目录全局唯一id介绍    全局唯一id特点:常见全局唯一id生成策略    1、数据库自增长序列或字段生成id 全局唯一id介绍     系统唯一id是我们在设计阶段常常遇到的问题。在复杂的...
  • 分布式唯一id:snowflake算法思考

    千次阅读 2018-02-11 08:46:21
    原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等。为什么消息会重复后续RocketMQ章节进行详细介绍,本节重点不在这里。 为了达到业务的幂等,必须要有这样一个id...
  • 分布式-全局唯一id

    万次阅读 2018-07-20 18:14:29
    下面就介绍一些常见的ID生成策略。 1.数据库自增长序列或字段 最常见的方式。利用数据库,全数据库唯一。 优点: 1)简单,代码方便,性能可以接受。 2)数字ID天然排序,对分页或者...
  • 关于设备唯一标识

    万次阅读 2015-05-06 11:19:24
    大家只能努力提高它的准确性,对于大的公司来说,可以自己开发出一套自己的机制,例如我上家公司成立过一个手机指纹的项目,专门处理设备唯一性的问题防止用户刷单,原来很简单,就是尽可能的把手机能读取到的信息...
  • java唯一无序id生成

    千次阅读 2015-12-16 13:23:32
    1、背景介绍  在许多项目中ID号是一个永恒的主题。在绝大多数情况下,这个唯一ID产生相对比较容易,毕竟现在众多的项目都是基于数据库的,只要把数据库的主键拿出来作为ID就可以确保ID在整个系统中的唯一性了。...
  • PHP生成唯一RequestID类

    千次阅读 2018-04-14 13:32:01
    本文介绍PHP生成唯一RequestID类,使用session_create_id()与uniqid()方法,保证唯一性,提供完整代码及演示,方便大家学习使用。 现在的系统设计一般使用分布式系统,一个请求可能要调用几个微服务处理,最后再把...
  • 分布式系统唯一ID生成方案汇总

    千次阅读 2017-05-04 16:14:24
    下面就介绍一些常见的ID生成策略。数据库自增长序列或字段最常见的方式。利用数据库,全数据库唯一。优点:1)简单,代码方便,性能可以接受。2)数字ID天然排序,对分页或者需要排序的结果很有帮助。缺点:1)不同...
  • MySql数据唯一标记方法

    千次阅读 2017-12-05 09:49:05
    对于mysql 唯一数据标定方法,首先想到的肯定是 自增id, 但是自增id一般只在table定义时用户,一旦在其它地方需要用到唯一标志的时候,可能就麻烦了,下面介绍二个mysql内置函数,应该可以解决大多数这样的问题: ...
  • iOS设备唯一标识符解决方案

    千次阅读 2016-06-11 12:46:10
    iOS设备唯一标识符解决方案最近在公司的项目中有记录设备唯一标识符的需求,通过唯一标识符去识别设备的注册类别从而进行角色的切换,在这个过程中查找了一些资料,在此稍作总结,留下一些痕迹,当然能给有同类需求的伙伴...
  • 获取安卓设备唯一ID

    万次阅读 2017-06-06 22:21:15
    介绍安卓设备中的几种ID 1、IMEI Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好。它根据不同的手机设备返回IMEI,...
  • C程序中唯一序列号的生成

    千次阅读 2014-06-03 20:10:48
    本文以一个实际的程序为例,介绍唯一序列号的生成过程。 本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX。 程序如下:/*********************************************************************** 版权所有 (C)...
  • snowflake方案 snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 703,241
精华内容 281,296
关键字:

唯一公司介绍