2 个不稳定版本
0.2.0 | 2023 年 8 月 19 日 |
---|---|
0.1.0 | 2023 年 8 月 6 日 |
#1652 在 命令行工具
31KB
259 行
normalized-hasher
创建文本文件的跨平台哈希值。
这是一个二进制包。如果您在寻找库包,请访问 normalized-hash
。
动机
哈希或校验和是验证文件内容的一种极好手段。您记录文件的哈希值,分发文件和哈希代码,然后每个人都可以再次运行哈希器来验证文件自您首次创建哈希以来是否已更改。任何微小的更改都会更改哈希码。即使是你看不到的更改。
在我的工作中,我们不幸有过几次这种情况。工作流程如下:我们创建代码并从该代码生成哈希值。两者都插入到规范文档中。然后我们将代码复制粘贴到客户的系统中,并再次运行哈希器以验证代码是否与规范中的代码相同。但有时我们会得到不同的哈希值。经过一些搜索原因后,我们偶然发现有一个同事没有像我们其他人一样使用 UNIX 行结束符(单个 LF)保存文件,而是使用 Windows 行结束符(CR 后跟 LF)。仅通过查看文件,它们看起来似乎是相同的,但在启用控制字符后,我们可以清楚地看到每一行的末尾都有差异。通过将代码复制到客户系统,行结束符会自动转换为 UNIX 风格,因此哈希值会与我们在系统上生成的哈希值不同。这是一个尴尬的情况,因为这涉及到大量的文书工作来请求更改已经完成的规范文档。
为了解决这个问题,我创建了这个程序。一个文件哈希器,在生成哈希值时自动将文件结束符转换为 UNIX 风格。因此,无论文件是如何创建的,哈希值都会相同。
安装
normalized-hasher
可以通过 Cargo 很容易地安装,通过 crates.io
cargo install --locked normalized-hasher
请注意,这里使用 --locked
标志是必要的,以确保具有与应用程序标记和测试时完全相同的依赖项。如果没有它,您可能会获得依赖项的更新版本,但如果依赖项改变了某些功能,则存在出现未定义和意外行为的风险。如果依赖项的公共API改变太多,应用程序甚至可能无法构建。
另外,可以从GitHub发布页面下载预构建的二进制文件。
使用方法
Usage: normalized-hasher [OPTIONS] <FILE_IN> [FILE_OUT]
Arguments:
<FILE_IN>
File to be hashed
[FILE_OUT]
Optional file path to write normalized input into
Options:
--eol <EOL>
End-of-line sequence, will be appended to each normalized line for hashing
[default: "\n"]
--ignore-whitespaces
Ignore all whitespaces
This will remove all whitespaces from the input file when generating the hash.
--no-eof
Skip last end-of-line on end-of-file
With this flag, no trailing EOL will be appended at the end of the file.
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
标志
-
--eol
使用
--eol
标志,您可以更改附加到每个标准化行的换行符序列以生成哈希。如果您明确想要CRLF结尾,例如,这可能会很有用。请注意,您需要在您的shell中正确转义控制字符。对于Bash,您可以输入
normalized-hasher --eol $'\r\n' input.txt output.txt
-
--ignore-whitespaces
在某些极端情况下,您可能想要忽略文件中的所有空白。使用
--ignore-whitespaces
标志,在生成哈希之前将移除所有空白。 -
--no-eof
使用
--no-eof
标志,您可以在文件末尾避免附加换行符序列。这对于不希望有此类尾随换行符的情况很有用,例如在Windows文件中。与通常以最终LF结束的UNIX文件不同,Windows文件通常不会以额外的CRLF结束。
示例
使用默认选项的简单示例,不写入输出文件
normalized-hasher input.txt
更复杂的示例,写入输出
normalized-hasher --eol $'\r\n' --no-eof input.txt output.txt
依赖项
~1.6–2.2MB
~45K SLoC