出于完整性目的对文本文件进行哈希处理
Hash of a textual file for integrity purposes
我有一个更一般的要求来跟踪提交到源代码并部署在二进制文件中的资产文件的更改,但现在我正在单元测试上下文中实现它,并面临未来的潜在问题。在问 TLDR 问题之前,我会展示很多上下文信息。
场景
一些应用程序资产是从通过 ClasspathResource
[1] 提交到 Git 存储库的 CSV 文件中加载的,它们有时可能会发生变化。更改发生在提交之间,但对于 运行time 应用程序,更改发生在应用程序的不同版本之间。
我的测试方案
我已经实施了以下机制来提醒我资源的变化:
@Before
public void setUp() throws Exception
{
assertEquals("Resource file has changed. Make sure the test reflects the changes in the file and update the checksum", MD5_OF_FILE,
DigestUtils.md5Hex(new ClassPathResource("META-INF/resources/assets.csv").getInputStream()));
}
基本上,我希望我的单元测试失败,直到我明确编码文件的校验和。当我 运行 md5sum assets.txt
时,我将结果硬编码到代码中,以便测试知道它们正在使用文件的固定版本。
问题
我 运行 在我自己的 Windows 盒子上进行测试,效果非常好。切换到Linux,我发现他们失败了。我马上意识到这可能是由于行尾,我完全忘记了。
在特定情况下,Git 配置为提交文件 LF
但签出(在 Windows 中)CRLF
。此配置对于使用源代码是合理的。
所以我需要检查资产文件是否以允许框 change/reinterpret 行尾的智能方式更改。对于 运行time 应用程序尤其如此,它将存储文件哈希并比较实际资产文件(可能已更改),对差异执行纠正操作 ==> 重新加载资产。
TL;DR
给定一个文本文件,我可以从中提取和存储任何散列(不仅仅是密码,我使用了 MD5),我如何判断它已经改变 不管 环境如何文件处理成,可以修改行尾?
备注
我有要求不要在资产本身中使用版本控制系统(例如,第一行有增量版本,因为开发人员将无法正确更新)。
[1] Spring 框架工具包装 Class.getResourceAsStream
一个解决方案可以将文件规范化为选定的行尾,即始终 CRLF
或始终 LF
,然后计算规范化内容的加密哈希。
例如计算 md5sum | dos2unix file
并在代码中使用适当的 Stream
动态规范化文件
我有一个更一般的要求来跟踪提交到源代码并部署在二进制文件中的资产文件的更改,但现在我正在单元测试上下文中实现它,并面临未来的潜在问题。在问 TLDR 问题之前,我会展示很多上下文信息。
场景
一些应用程序资产是从通过 ClasspathResource
[1] 提交到 Git 存储库的 CSV 文件中加载的,它们有时可能会发生变化。更改发生在提交之间,但对于 运行time 应用程序,更改发生在应用程序的不同版本之间。
我的测试方案
我已经实施了以下机制来提醒我资源的变化:
@Before
public void setUp() throws Exception
{
assertEquals("Resource file has changed. Make sure the test reflects the changes in the file and update the checksum", MD5_OF_FILE,
DigestUtils.md5Hex(new ClassPathResource("META-INF/resources/assets.csv").getInputStream()));
}
基本上,我希望我的单元测试失败,直到我明确编码文件的校验和。当我 运行 md5sum assets.txt
时,我将结果硬编码到代码中,以便测试知道它们正在使用文件的固定版本。
问题
我 运行 在我自己的 Windows 盒子上进行测试,效果非常好。切换到Linux,我发现他们失败了。我马上意识到这可能是由于行尾,我完全忘记了。
在特定情况下,Git 配置为提交文件 LF
但签出(在 Windows 中)CRLF
。此配置对于使用源代码是合理的。
所以我需要检查资产文件是否以允许框 change/reinterpret 行尾的智能方式更改。对于 运行time 应用程序尤其如此,它将存储文件哈希并比较实际资产文件(可能已更改),对差异执行纠正操作 ==> 重新加载资产。
TL;DR
给定一个文本文件,我可以从中提取和存储任何散列(不仅仅是密码,我使用了 MD5),我如何判断它已经改变 不管 环境如何文件处理成,可以修改行尾?
备注 我有要求不要在资产本身中使用版本控制系统(例如,第一行有增量版本,因为开发人员将无法正确更新)。
[1] Spring 框架工具包装 Class.getResourceAsStream
一个解决方案可以将文件规范化为选定的行尾,即始终 CRLF
或始终 LF
,然后计算规范化内容的加密哈希。
例如计算 md5sum | dos2unix file
并在代码中使用适当的 Stream
动态规范化文件