1

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

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

因此,有任何方法可以使 UDID 更短但仍然是唯一的。如果我还可以从短字符串中获取 UDID 会更好。

4

2 回答 2

3

您可以将十六进制数字转换为 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。

于 2011-04-04T06:38:59.913 回答
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]];
}
于 2012-11-01T20:25:35.097 回答