2011-04-04 26 views
1

我想使iOS設備的UDID小於或等於15個字符。如何讓ios UDID更短但仍然獨特enlough

我正在將一個基於Symbian的客戶端服務器軟件移植到iOS。服務器端使用IMEI(15位數字)來識別客戶端電話。現在在iOS上,UDID太長(40個十六進制數字)。因爲我想盡量減少服務器程序或數據庫的更改,所以我需要將UDID存儲在varchar(15)中。

因此,有什麼方法可以使UDID更短但仍然獨一無二。如果我也可以從短字符串中獲取UDID,那可能會好很多。

回答

3

您可以將十六進制數字轉換爲20個拉丁-1字符(≤0xff)或10個Unicode BMP字符(≤0xffff)。

如果該varchar(15)可以接受Unicode BMP字符,那麼我們就完成了。

否則,你可以從這20個拉丁字母中減去最後5個字符。 UDID實際上是一些設備唯一值的SHA-1 hash,它可以被認爲是非常隨機的,並且數字是均勻分佈的。因此,使用15個Latin-1字符時,縮減的UDID應該能夠代表256個設備,這遠遠不夠。

事實上,即使您只需從UDID中取得15個十六進制字符,它也可能已經代表了〜10個設備。

請注意,最後2種方法是有損的,即無法從15個字符中獲得完整的UDID。

+0

嗨,我有一個解決方案的問題,因爲我需要通過txt文件傳遞數據到服務器,它使用/ r/n將行和冒號分隔開來分隔列。所以我的問題是如果ASCII或Unicode字符碰巧是一個冒號,一個/ r或不會在屏幕上顯示的東西。例如,在ASCII中,0x08是退格,0x1C是文件分隔符,類似的東西。那麼如果短的UDID碰巧有這樣的角色會發生什麼? – 2011-04-09 14:01:27

+0

對不起,延遲。 – 2011-04-09 14:05:59

+0

@趙:你可以使用UDID的一部分的base-64編碼。當然,這隻能代表64^15〜10^27的設備。 – kennytm 2011-04-09 16:14:26

2

我剛纔寫的主旨 - >https://gist.github.com/3996097

你想想一個CFUUID + SHA1 +子+隨機大寫什麼?

//Get a random hash (Generated from CFUUID+sha1) 
NSString *hash = [NSString sha1:[NSString getUUID]]; 

//Shorten the sha1 
NSString *short_random_id = [hash substringFromIndex:[hash length]-10]; 

//Random uppercase/lowercase the id 
NSMutableString *random_id_final = [NSMutableString string]; 
for (NSUInteger i = 0; i < [short_random_id length]; i++) 
{ 
    NSString *substring = [short_random_id substringWithRange:NSMakeRange(i, 1)]; 
    [random_id_final appendString:(rand() % 2) ? [substring lowercaseString] : [substring uppercaseString]]; 
} 
相關問題