2015-11-17 15:59:03 dong_vip 阅读数 348

数据库中需要使用唯一标识,但是使用自增id不能完成功能,可以使用uuid。

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。

UUID由以下几部分的组合:

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

(2)时钟序列。

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

UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

iOS 获取

CFUUIDRef uuid = CFUUIDCreate(NULL);

CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);

NSString *str = [NSString stringWithFormat:@"%@", uuidStr];

IOS UUID
2013-01-18 23:01:52 MyGameZone 阅读数 995
- (NSString *)createUUID


{
  // Create universally unique identifier (object)


  CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);


  // Get the string representation of CFUUID object.


  NSString *uuidStr = [(NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject) autorelease];


  // If needed, here is how to get a representation in bytes, returned as a structure


  // typedef struct {


  //   UInt8 byte0;


  //   UInt8 byte1;


  //   ...


  //   UInt8 byte15;


  // } CFUUIDBytes;


  CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuidObject);

  CFRelease(uuidObject);

  return uuidStr;

}

2014-05-06 16:31:37 yujianxiang666 阅读数 644
原文链接:http://blog.csdn.net/focusjava/article/details/12839517

WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android。

更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS7中也失效了。

IOS系统中,获取设备唯一标识的方法有很多:

一.UDID(Unique Device Identifier)

 UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。

二.UUID(Universally Unique Identifier) 

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.

三.MAC Address

四.OPEN UDID

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

六.Vindor标示符 (IDFV-identifierForVendor)

Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。

经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。

 

但是很不幸,上面所有这些表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样。

由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。

通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。

keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。

那么,如何在应用里使用使用keyChain呢,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。

直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,我们可以使用已经封装好了的工具类KeychainItemWrapper来对keychain进行操作。

KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上下载了GenericKeychain项目后,

只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

/** 初始化一个保存用户帐号的KeychainItemWrapper */
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"
                                                                   accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];  
 
//保存数据
[wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];    
 
[wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];    
 
//从keychain里取出帐号密码
NSString *password = [wrapper objectForKey:(id)kSecValueData];      
 
//清空设置
[wrapper resetKeychainItem];

其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会出错!

2018-05-03 12:12:48 huanglinxiao 阅读数 994

最近项目中需要用到UUID做标识,于是自己就做了一个小例子。如果有什么问题,请大佬评论指出。

1.创建一个NSObject类 KeyChainStore

   下面是.m文件中的实现

#import "KeyChainStore.h"

@implementation KeyChainStore

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {

    return [NSMutableDictionarydictionaryWithObjectsAndKeys:

            (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 = [selfgetKeychainQuery:service];

    //Delete old item before add new item

    SecItemDelete((CFDictionaryRef)keychainQuery);

    //Add new object to search dictionary(Attention:the data format)

    [keychainQuery setObject:[NSKeyedArchiverarchivedDataWithRootObject:data] forKey:(id)kSecValueData];

    //Add item to keychain with the search dictionary

    SecItemAdd((CFDictionaryRef)keychainQuery,NULL);

}


+ (id)load:(NSString *)service {

    id ret = nil;

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:service];

    //Configure the search setting

    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue

    [keychainQuery setObject:(id)kCFBooleanTrueforKey:(id)kSecReturnData];

    [keychainQuery setObject:(id)kSecMatchLimitOneforKey:(id)kSecMatchLimit];

    CFDataRef keyData =NULL;

    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) ==noErr) {

        @try {

            ret = [NSKeyedUnarchiverunarchiveObjectWithData:(__bridgeNSData *)keyData];

        } @catch (NSException *e) {

            NSLog(@"Unarchive of %@ failed: %@", service, e);

        } @finally {

        }

    }

    if (keyData)

        CFRelease(keyData);

    return ret;

}


+ (void)deleteKeyData:(NSString *)service {

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:service];

    SecItemDelete((CFDictionaryRef)keychainQuery);

}


2.在另一个类中 进行读取和存储

+(NSString *)getUUID

{

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

    NSString *documentsDirectory = [pathsobjectAtIndex:0];

     NSFileManager *fileManager = [NSFileManagerdefaultManager];

    NSString *filePath = [documentsDirectorystringByAppendingPathComponent:@"text.plist"];

 

    NSString * strUUID = (NSString *)[KeyChainStoreload:@"com.company.app.usernamepassword"];

    if(![fileManagerfileExistsAtPath:filePath]) //如果不存在

    {

      

    //首次执行该方法时,uuid为空

    if ([strUUID isEqualToString:@""] || !strUUID)

    {

        //生成一个uuid的方法

        CFUUIDRef uuidRef =CFUUIDCreate(kCFAllocatorDefault);

        

        strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));

        //将该uuid保存到keychain

        [KeyChainStoresave:KEY_USERNAME_PASSWORDdata:strUUID];

        //写入数据到plist文件

        NSMutableDictionary *dataDic = [NSMutableDictionarydictionary];

        [dataDic setObject:strUUIDforKey:KEY_USERNAME_PASSWORD];

        //写入plist里面

        if([dataDicwriteToFile:filePath atomically:YES]){

            NSLog(@"su");

        };

        CFRelease(uuidRef);

    }

    }else{

        //读取

        NSMutableDictionary *dataDictionary = [[NSMutableDictionaryalloc] initWithContentsOfFile:filePath];

        NSLog(@"---plist一开始保存时候的内容---%@",dataDictionary);

        if(dataDictionary)

        {

           strUUID= [dataDictionary objectForKey:KEY_USERNAME_PASSWORD];

        }

    }

    return strUUID;

}



2013-03-27 11:54:50 itianyi 阅读数 9080

iOS 生成 UUID(或者叫GUID)例子代码

NSString * gen_uuid()

{

CFUUIDRef uuid_ref = CFUUIDCreate(NULL);

CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);

CFRelease(uuid_ref);

NSString *uuid = [NSString stringWithString:(NSString*)uuid_string_ref];

CFRelease(uuid_string_ref);

return uuid;

}


在oc中,uuid的表示

1,用一个16个字节的数组表示

 //guid

typedef struct {

#define KAUTH_GUID_SIZE 16/* 128-bit identifier */

unsignedchar g_guid[KAUTH_GUID_SIZE];

} guid_t;


//uuid

typedef unsigned char __darwin_uuid_t[16];//定义了一个元素类型为unsigned char,含有16个元素的数组类型__darwin_uuid_t,以后使用__darwin_uuid_t定义的类型都是一个含有16个字符的数组

typedef __darwin_uuid_t uuid_t;


2,使用结构体表示

typedef struct {
   UInt8 byte0;
   UInt8 byte1;
   UInt8 byte2;
   UInt8 byte3;
   UInt8 byte4;
   UInt8 byte5;
   UInt8 byte6;
   UInt8 byte7;
   UInt8 byte8;
   UInt8 byte9;
   UInt8 byte10;
   UInt8 byte11;
   UInt8 byte12;
   UInt8 byte13;
   UInt8 byte14;
   UInt8 byte15;
} CFUUIDBytes;
3,在iOS6.0之后,可以使用系统自带的NSUUID类


IOS查看UUID

阅读数 618

iOS获取设备UUID

阅读数 234

iOS生成UUID

阅读数 1232

iOS 生成随机的UUID

阅读数 3212

没有更多推荐了,返回首页