Хеширование файлов project.pbxproj - какой хеш используется и как?
Если вы загляните в project.pbxproj, вы увидите, что каждый файл в проекте имеет хеш
Например
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1D60589F0D05DD5A006BFB54 - это хеш для структуры связанного фундамента.
Интересно, как они рассчитываются, то есть какая функция используется и какая метаинформация помимо имени файла входит во входные данные для хэша.
2 ответа
Objective-C:
uuid_t uuid;
uuid_generate(uuid);
NSString *UUID = @"";
for (int i = 0; i < 12; i++) UUID = [UUID stringByAppendingFormat:@"%02X", uuid[i]];
Python:
def GenerateId(cls):
return ''.join(str(uuid.uuid4()).upper().split('-')[1:])
Решение Сергея (на самом деле очень) хорошее, но я думаю, что оно заслуживает некоторого объяснения: единственная причина, по которой XCode использует этот нечеловеческий формат для project.pbxproj
может гарантировать, что каждый ключ уникален.
На самом деле, я сделал несколько тестов, прежде чем читать решение Сергея, и, пока хеш уникален, а файл непротиворечив (нет висячих файлов и т. П.), Вы можете поместить в качестве хеша практически то, что хотите (если UUID-подобен, по крайней мере, я не пробовал с более короткими строками или не HEX-цифрами...).
Принятый ответ также подтверждает это, поскольку UUID4 является чисто случайным идентификатором, как указано здесь:
это означает, что XCode не может перепроверить ресурс с ключом (как это могло бы быть, если ключи, где MD5 хэширует, например).
Надеюсь, это поможет