如何让ios UDID更短,但仍然是独一无二的

时间:2011-04-04 06:30:28

标签: iphone udid

我想让iOS设备的UDID小于或等于15个字符。

我正在将基于Symbian的客户端 - 服务器软件移植到iOS。服务器端使用IMEI(15位数)来识别客户端电话。现在在iOS上,UDID太长(40个十六进制数字)。由于我想最小化服务器程序或数据库的更改,我需要将UDID存储在varchar(15)中。

所以有任何方法可以缩短UDID,但仍然是独一无二的。如果我也可以从短路的字符串中获取UDID,那会好得多。

2 个答案:

答案 0 :(得分:3)

您可以将十六进制数字转换为20个Latin-1字符(≤0xff)或10个Unicode BMP字符(≤0xffff)。

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

否则,您可以从20个Latin-1字符中删除最后5个字符。 UDID实际上是某些设备唯一值的SHA-1 hash,可以认为它是非常随机的,并且数字是均匀分布的。因此,使用15个Latin-1字符,减少的UDID应该能够代表256 15 ~10 36 设备,这远远不够。

事实上,即使您只从UDID中取出15个十六进制字符,它也可以代表~10 18 设备。

请注意,最后两种方法是有损的,即无法从15个字符中获取完整的UDID。

答案 1 :(得分: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]];
}