【问题标题】:Is the file hashing/checksum value case insensitive?文件散列/校验和值是否不区分大小写?
【发布时间】:2020-01-23 05:22:01
【问题描述】:

我的问题只是关于文件散列而不是一般的散列函数。我的假设是文件校验和/散列的值不区分大小写。我担心的是我找不到任何在线文档来确认这一点。我只得到以下两点来支持我的主张。

  1. 此链接包含一些文件哈希值。它们都不包含任何大写字母。 https://www.virtualbox.org/download/hashes/6.1.2/SHA256SUMS

  2. 当我使用 Powershell Get-FileHash cmdlet 时,所有返回都是大写。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-7

谁能帮我确认我的假设,并提供一些关于 Windows 和 Linux 操作系统中文件的文档?

【问题讨论】:

  • 您正在寻找二进制值的十六进制表示。十六进制值可以写成小写和大写。引用en.wikipedia.org/wiki/Hexadecimal:“最常见的符号“0”-“9”表示值 0 到 9,“A”-“F”(或者“a”-“f”)表示值十到十五”。这意味着,如果它涉及相同的文件内容 $Value.ToUpper() 应该返回一个区分大小写的可比较值。请注意,PowerShell 中的字符串比较默认情况下是不敏感的,这意味着如果文件相等,$Value1 -eq $Value2 将返回 true

标签: powershell hash


【解决方案1】:

哈希和校验和通常以hexadecimal 表示法表示。虽然通常使用大写的A-F 而不是小写的a-f,但这并没有什么区别。

至于参考,这个问题太基础了,很难找到可靠的参考。一种是 C 编程语言的 ISO/IEC 9899 标准:

十六进制常量由前缀 0x 或 0X 后跟 十进制数字和字母 a(或 A)到 f(或 F) 值分别为 10 到 15。

在某些用例中,例如CSS,可能首选小写字母,因为与其他小写字符一起阅读更令人愉悦。 .Net 的Int32.ToString 支持标准数字格式器。 x 小写,X 大写。

在 System.Convert 中,ToInt32 会将值从一个基数转换为 32 位整数。让我们看看十六进制数字AA在不同情况下如何转换为十进制。像这样,

[convert]::toint32("aa", 16)
170
[convert]::toint32("AA", 16)
170
[convert]::toint32("aA", 16)
170
[convert]::toint32("Aa", 16)
170

每个字母大小写组合都表示相同的十进制值 170。不过不要在哈希上尝试这个,因为它们通常大于 32 位整数。

【讨论】:

  • 感谢您为我指明正确的方向。所以真正重要的是静默结果(位)是encoded。现在可以肯定地说 Windows/Linux 文件校验和以十六进制 (Base16) 编码,这就是它不区分大小写的原因。
【解决方案2】:

我的问题只是关于文件散列而不是一般的散列函数。我的假设是文件校验和/散列的值不区分大小写。

哈希是字节序列,它们根本没有大小写。

哈希通常编码为十六进制显示,6个“字母”(a到f)可以是任何一种情况。这主要是一个风格问题,尽管我知道系统在遇到“错误”大小写时会反对(有些只接受小写,有些只接受大写)。

还要注意,例如在 case 相关的情况下,将哈希存储或显示为 base64 并非闻所未闻。不知道为什么你在问(例如,它是在闲逛,还是你有一个实际的用例),很难完全明确地回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2014-01-19
    • 2012-02-03
    • 2011-03-27
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多