Хеширование файлов 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 является чисто случайным идентификатором, как указано здесь:

UUID4 объяснение в Википедии

это означает, что XCode не может перепроверить ресурс с ключом (как это могло бы быть, если ключи, где MD5 хэширует, например).

Надеюсь, это поможет

Другие вопросы по тегам