文件的哈希/校验和值是否区分大小写?

3
我的问题只涉及文件哈希而非哈希函数。我假设文件校验和/哈希值不区分大小写。我的担忧是找不到任何在线文档来证实这一点。我只有以下两个观点支持我的说法。
1. 这个链接包含一些文件哈希值。它们中没有一个包含大写字母。 https://www.virtualbox.org/download/hashes/6.1.2/SHA256SUMS 2. 当我使用 Powershell Get-FileHash 命令时,所有返回的结果都是大写字母。 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-7 有人能帮我确认我的假设,并提供关于 Windows 和 Linux 操作系统中文件的文档吗?

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

3
我的问题只涉及文件哈希而不是哈希函数。我的假设是文件校验和/哈希值对大小写不敏感。
哈希值是字节序列,它们根本没有大小写之分。
通常将哈希值编码为十六进制以显示,其中6个“字母”(a到f)可以是任何大小写。这主要是一个风格问题,但我知道有些系统在获取“错误”的大小写时会出错(有些只接受小写,其他则只接受大写)。
此外要注意,例如有些情况下会将哈希值存储或显示为base64,其中大小写是相关的。不知道您为什么要问这个问题(例如是闲聊还是真实用例),很难给出完全绝对的答案。

3
哈希和校验和通常以十六进制表示法呈现。虽然使用大写字母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位整数大。

感谢您指引我正确的方向。真正重要的是哈希结果(位)如何编码。现在可以肯定地说,Windows/Linux文件校验和以十六进制(Base16)编码,这就是为什么它不区分大小写的原因。 - Seaport

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接