kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

UUID生成方法

リポジトリ
S/D Appで使う機会があったので調べました

UUID (Universally Unique Identifier)

  • 全世界でIDが重複しない程度に桁数が大きい( 2^{122}=5,316,911,983,139,663,491,615,228,241,121,378,304通り)
  • App•サービスごとに都度発行
  • Appを削除してから再取得すると異なる値が発行される。
  • 各App間で発行されるUUIDには関連がない
  • UDID(Unique Device Identifier)をアプリから取得することがiOS5以降非推奨になり、その代わりとして使う

Unix

uuidgen [ -r | -t ]
  • -r(default)
    • 乱数でUUID生成 version.4仕様
  • -t
    • 現在時刻 + MAC Addressで生成 version.1仕様

Objective-C(iOS)

FoundationのCFUUIDRef, CFUUIDCreateString, CFReleaseを使う
iOS6以降ではNSUUIDが使える
参考UUIDの作り方 – Objective-C, iOSアプリ開発 i Devris
※CFRelease(NULL) はクラッシュするみたいなので、NULLチェックした方が良さそう

#import <Foundation/Foundation.h>
#define RELEASE_CFOBJ(cfobj) (cfobj ? CFRelease(cfobj) : NULL)

NSString* genUUID() {
    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
    //case Non-ARC: NSString *uuidStr = [(NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid) autorelease];
    RELEASE_CFOBJ(uuid);
    return uuidStr;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"\n%@\n%@", genUUID(), [[NSUUID UUID] UUIDString]);
    }
    return 0;
}

C++(Boost.Uuid)

Boost.Uuidを使えば簡単

boost::uuids::uuid u = boost::uuids::random_generator()();

同じ文字列からはどの環境で生成しても等しい値が得られるようにすることもできる

#include <iostream>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>

namespace bUUID = boost::uuids;

int main(int argc, const char * argv[]) {
    bUUID::random_generator rgen; //random
    bUUID::uuid r1 = rgen(), r2 = rgen();
    
    bUUID::string_generator sgen; //stringでuuid作成
    bUUID::uuid s1 = sgen("ABCDEF0123456789abcdef0123456789"), s2 = sgen("0123456789abcdef0123456789abcdef");
    
    bUUID::name_generator ngen(r1); //ngen(s1) //他のuuidをベースにして文字列からUUIDを生成
    std::string name = "https://www.google.co.jp/";
    bUUID::uuid n1 = ngen(name), n2= ngen(name), n3 = ngen(name+"webhp?hl=ja");
    
    std::cout
    << "random_generator\n\t" << r1 << "\n\t" << r2 << std::endl
    << "string_generator\n\t" << s1 << "\n\t" << s2 << std::endl
    << "name_generator\n\t" << n1 << "\n\t" << n2 << "\n\t" << n3 << std::endl;
    
    return 0;
}

Java

import java.util.UUID;
public class UUIDTest {
	public static void main(String[] args) {
		UUID uuid = UUID.randomUUID();
		System.out.println(uuid.toString());
	}
}

Perl

Data::UUIDを使う。入ってない場合は、

sudo perl -MCPAN -e 'install Data::UUID'

でインストール

use Data::UUID;
my $uuid = Data::UUID->new;
print $uuid->create_str(), "\n";