我想使iOS設備的UDID小於或等於15個字符。如何讓ios UDID更短但仍然獨特enlough
我正在將一個基於Symbian的客戶端服務器軟件移植到iOS。服務器端使用IMEI(15位數字)來識別客戶端電話。現在在iOS上,UDID太長(40個十六進制數字)。因爲我想盡量減少服務器程序或數據庫的更改,所以我需要將UDID存儲在varchar(15)中。
因此,有什麼方法可以使UDID更短但仍然獨一無二。如果我也可以從短字符串中獲取UDID,那可能會好很多。
我想使iOS設備的UDID小於或等於15個字符。如何讓ios UDID更短但仍然獨特enlough
我正在將一個基於Symbian的客戶端服務器軟件移植到iOS。服務器端使用IMEI(15位數字)來識別客戶端電話。現在在iOS上,UDID太長(40個十六進制數字)。因爲我想盡量減少服務器程序或數據庫的更改,所以我需要將UDID存儲在varchar(15)中。
因此,有什麼方法可以使UDID更短但仍然獨一無二。如果我也可以從短字符串中獲取UDID,那可能會好很多。
您可以將十六進制數字轉換爲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。
我剛纔寫的主旨 - >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]];
}
嗨,我有一個解決方案的問題,因爲我需要通過txt文件傳遞數據到服務器,它使用/ r/n將行和冒號分隔開來分隔列。所以我的問題是如果ASCII或Unicode字符碰巧是一個冒號,一個/ r或不會在屏幕上顯示的東西。例如,在ASCII中,0x08是退格,0x1C是文件分隔符,類似的東西。那麼如果短的UDID碰巧有這樣的角色會發生什麼? – 2011-04-09 14:01:27
對不起,延遲。 – 2011-04-09 14:05:59
@趙:你可以使用UDID的一部分的base-64編碼。當然,這隻能代表64^15〜10^27的設備。 – kennytm 2011-04-09 16:14:26