Hash 对于具有相同前6个字符的4个以上文件,Dos 8.3文件名哈希是多少?

Hash 对于具有相同前6个字符的4个以上文件,Dos 8.3文件名哈希是多少?,hash,dos,Hash,Dos,例如:AB5C8A~1 据我所知,前两个字符来自常规文件名。有人能告诉我DOS是如何处理第三到第六个字符的吗?从中,没有强制算法可以从长文件名创建8.3名称,但他们确实尝试遵循约定。对于示例中的文件名,它似乎在使用选项4,其中is使用文件名的散列来生成4个十六进制数字 我发现了一些代码,但我不知道它是否与microsoft使用的相同 申请牌照 所有(部分?)源可用于其系统 /*msdos\u short\u hex\u编号-- *设置SFN中十六进制数的例程。 * *参数: *名称-要更改的名称

例如:AB5C8A~1

据我所知,前两个字符来自常规文件名。有人能告诉我DOS是如何处理第三到第六个字符的吗?

从中,没有强制算法可以从长文件名创建8.3名称,但他们确实尝试遵循约定。对于示例中的文件名,它似乎在使用选项4,其中is使用文件名的散列来生成4个十六进制数字

我发现了一些代码,但我不知道它是否与microsoft使用的相同

申请牌照

所有(部分?)源可用于其系统

/*msdos\u short\u hex\u编号--
*设置SFN中十六进制数的例程。
*
*参数:
*名称-要更改的名称
*num-要设置的数字
*
*返回:
*没什么
*
*/
静态空隙
msdos_short_name_hex(字符*sfn,整数)
{
静态常量字符*hex=“0123456789ABCDEF”;
char*c=MSDOS\u目录名称(sfn);
int i;
对于(i=0;i<2;i++,c++)
如果((*c='')| |(*c=''))
*c='uu';
对于(i=0;i<4;i++,c++)
*c=hex[(num>>((3-i)*4))&0xf];
*c++='~';
*c++='1';
}

肖恩·切希尔在他的回答中提供了一个很好的参考。但这些规则只是部分记录在案

即使完整的算法有文档记录,我也不知道在不知道包含文件夹的完整历史记录的情况下,如何可靠地预测给定文件的8.3名称。指定的名称可能会有所不同,具体取决于创建前同一文件夹中存在多少同名文件

获取8.3名称的唯一可靠方法是查询目录

最简单的方法是使用DIR命令的
/x
选项,但该输出不便于解析

将8.3名称放入变量的最简单方法是使用带有FOR变量或CALL参数的
~s
修饰符

for %%F in ("long file name.ext") do set "shortName=%~sF"

注意-使用FOR而不是CALL要快得多


8.3名称也可以通过WMIC数据文件别名获得。

非常感谢您的回答——我的问题正是关于您提到的“哈希”的。这个散列背后的数学是什么?考虑到文件历史记录和所有数据,DOS如何实际计算这些数字?我问的原因是为了帮助我理解如何模仿它。根据维基,计算是不成文的,我也读过,但希望可能有人对DOS是如何构建的有深入的了解,可能知道。从另一个网站上找到一些可能有帮助的来源。非常感谢您的回答--不过,我的问题是关于这个散列背后的数学。考虑到文件历史记录和所有数据,DOS如何实际计算这些数字?我请求的原因是帮助我理解如何模仿它。@alhambra-你为什么要模仿它?在我听来,你想根据长名字来预测短名字。正如我试图解释的,如果没有文件夹的完整文件历史记录,这是不可能做到的。我所说的历史是指文件夹中的每个文件创建、重命名或删除,以及该事件发生的时间。我不认为Windows可以维持这样的历史水平。因此,了解哈希算法很可能对您没有好处。我想在我自己模拟的DOS提示符中,根据完整的文件历史来预测短名称。在观察了散列创建的与文件名相关的一些模式之后,我对散列也变得更加好奇。
for %%F in ("long file name.ext") do set "shortName=%~sF"
call :getShort "long file name.ext"
exit /b

:getShort
set "shortName=%~s1"
exit /b