我正在检查一个用Java编写的遗留应用程序的代码,这是一个内容交付服务器。它们有一个文件存储库,其中包含的文件都以其内容的MD5哈希十六进制命名。
7ABC1FBF6109EAB64DF6682158317181.dat
有成千上万这样的文件。存储库文件结构如下:
C:/base/resources/repository/{First two digits of hex MD5 hash}/{MD5 hash hex}.dat
,
C:/base/resources/repository/7A/7ABC1FBF6109EAB64DF6682158317181.dat
假设没有业务逻辑需要它(我告诉你没有),是否有任何理由可以验证这样做。应用程序获取对文件的请求,并使用文件中的内容(由散列映射)进行响应。
我实在想不起来。
应用程序在Linux机器上运行,我不知道他们使用的是哪个发行版或什么文件系统。
当单个目录包含大量文件时,某些文件系统调用变得非常缓慢,特别是在Windows上。而且管理它们也比较困难,因为简单地列出它们的内容太慢,而且返回的条目太多。
通过散列的属性
{First two digits of hex MD5 hash}/{MD5 hash hex}.dat
是没有意义的。在任何文件系统中,目录都应该在逻辑上将内容分组在一起,但是根据定义,共享相同前缀的两个散列项之间没有逻辑关系。我的猜测是有人厌倦了一次在一个目录中看到太多的文件,所以这可能与性能有关。
像文件管理工具这样的GUI工具可能会挂起,或者如果该文件夹也是远程的(NAS、SAMBA),那么仅仅简单地查看一下内容可能需要很长时间。当然,应用程序可以更好地按日期或其他不那么随机的方式对文件进行分组。