文件的 project.pbxproj 散列 - 使用啥散列以及如何使用?

Posted

技术标签:

【中文标题】文件的 project.pbxproj 散列 - 使用啥散列以及如何使用?【英文标题】:project.pbxproj hashing for files - what hash is used and how?文件的 project.pbxproj 散列 - 使用什么散列以及如何使用? 【发布时间】:2014-03-25 23:18:34 【问题描述】:

如果你查看 project.pbxproj,你会看到项目中的每个文件都有一个哈希

例如

1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; ;

1D60589F0D05DD5A006BFB54 是链接基础框架的哈希值。

我想知道这些是如何计算的,即使用什么函数以及除了文件名之外还有哪些元信息进入散列的输入。

【问题讨论】:

【参考方案1】:

目标-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:])

【讨论】:

我不确定我是否理解您的回答。在 Python 代码中,输入 (cls) 似乎根本没有用于生成返回值。请您编辑您的答案以添加更多解释。 对不起,我不是 Python 程序员,但有时我会使用一些脚本。此字符串来自github.com/kronenthaler/mod-pbxproj/blob/master/mod_pbxproj.py - 您可以检查整个文件并找到更多信息。 不完全是 100% 我正在寻找的,但这是我得到的最多信息。谢谢!【参考方案2】:

Sergey 的解决方案(实际上非​​常)很好,但我认为它可能值得解释一下:XCode 对project.pbxproj 使用这种不人道的格式的唯一原因可能是确保每个键都是唯一的。

事实上,我在阅读 Sergey 的解决方案之前做了一些测试,只要哈希是唯一的并且文件是一致的(没有悬空文件之类的......),你几乎可以把哈希你想要什么(如果像 UUID 一样,至少,我没有尝试使用较短的字符串或非 HEX 数字......)。

接受的答案也证实了这一点,因为 UUID4 是一个纯粹的随机标识符,如下所述:

UUID4 explanation on Wikipedia

这意味着 XCode 不可能使用密钥交叉检查资源(例如,如果 MD5 散列的密钥可以这样做)。

希望这会有所帮助

【讨论】:

以上是关于文件的 project.pbxproj 散列 - 使用啥散列以及如何使用?的主要内容,如果未能解决你的问题,请参考以下文章

升级本机反应时如何解决“project.pbxproj”文件中的冲突?

聊聊 Xcode 项目文件中的 project.pbxproj

哪些工具支持编辑 project.pbxproj 文件?

项目 ...xcodeproj 无法打开,因为它缺少其 project.pbxproj 文件

聊聊 Xcode 项目文件中的 project.pbxproj

Xcode 项目错误:xcodeproj 无法打开,因为它缺少其 project.pbxproj 文件