这只是一个一般的设计问题。我正在设计一个需要以分层方式存储文件的小应用程序,例如:
dept/group/user1/file#1
dept/group5/user2/file#7
用户名也可以包含任何字符,例如“/”、“@”。
使用用户名作为目录名是否明智,或者我应该在每个组下维护一个映射文件,将每个用户名映射到一个简化的通用目录名,即
user1=dir1
user7=dir7
尽管有些人建议对您的用户名进行散列处理,但这对于检查来说既不透明(因此您无法通过检查文件系统来判断与目录对应的用户名是什么)并且不可逆(因此人类系统管理员和软件都不能通过查阅文件系统枚举用户名)。因此,它可能适合您,也可能不适合您。
我建议对用户名进行编码。通过从MIME中使用的 2 种主要内容编码中启发自己,我可以建议使用quoted-printable还是base64吗?
使用quoted-printable,您可以对用户名中的所有“不寻常”字节进行编码,同时保留大部分可打印字符。这样,在使用ls
. 您应该至少编码所有控制字符(值介于 0 和 31 以及 127 之间的字节)、=、/以及 shell 特殊的所有字符(如空格、引号、$、#等...) . 带引号的可打印的缺点是,如果用户名包含大量此类不寻常的字符,则文件名可能会变得很长:每个编码序列占用 3 个字节。
Base64是一种比quoted-printable 更紧凑的编码,以防用户名可能包含许多需要编码的字符,但人类无法立即阅读,因此ls
您的目录看起来不太清楚。请注意,您必须修改标准 base64 的最后一个字符,例如通过将字母表的最后一个字符从/更改为- 像这样,因为否则编码的字符串可以包含/。