我想让 iOS 设备的 UDID 小于或等于 15 个字符。
我正在将基于 Symbian 的客户端服务器软件移植到 iOS。服务器端使用 IMEI(15 位数字)来识别客户端电话。现在在 iOS 上,UDID 太长(40 个十六进制数字)。由于我想最小化服务器程序或数据库的更改,我需要将 UDID 存储在 varchar(15) 中。
因此,有任何方法可以使 UDID 更短但仍然是唯一的。如果我还可以从短字符串中获取 UDID 会更好。
您可以将十六进制数字转换为 20 个 Latin-1 字符 (≤0xff) 或 10 个 Unicode BMP字符 (≤0xffff)。
如果 varchar(15) 可以接受 Unicode BMP 字符,那么我们就完成了。
否则,您可以从这 20 个 Latin-1 字符中删除最后 5 个字符。UDID 实际上是一些设备唯一值的SHA-1 哈希,可以认为是非常随机的,并且数字是均匀分布的。因此,使用 15 个 Latin-1 字符,简化后的 UDID 应该能够表示 256个 15 ~ 10 36 个设备,这已经绰绰有余了。
事实上,即使您只从 UDID 中提取 15 个十六进制字符,它也可以表示大约 10 18 个设备。
请注意,最后两种方法是有损的,即您无法从 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]];
}