Hash目录是一种优化文件存储性能的方法。无论是Windows还是Linux,无论是NTFS还是ext4,每个目录下所能容纳的项目数是有限的。并不是不能保存,而是当项目数量过大的时候,会降低文件索引速度,所以权衡一个目录下应该保存多少文件是很必要的。保存得多了会影响性能,保存得少了会造成目录太多和空间浪费。所以当保存大批文件的时候,需要有一种算法能将文件比较均匀地“打散”在不同的子目录下以提高每一级的索引速度,这种算法就是 Hash。通常用的MD5、sha1等都可以用来做Hash目录,我的mSession里也同样使用了MD5,取得sessionID的第一位和第九位,这就构成了两级Hash路径,也就是说,系统把所有的Session文件分散到了16×16=256个子目录下。假设Linux每个目录下保存1000个文件可以获得最好的空间性能比,那么系统在理想情况下可以同时有256000个session文件在被使用。
#!/usr/bin/env python # coding=utf-8 import os import sys mlist = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] path = sys.argv[1:] or './' if type(path) is list and len(path) == 1: path = path[0] elif type(path) is list and len(path) !=1: sys.stderr.write(' Usage: %s [path] ' % sys.argv[0]) sys.exit(1) if not os.path.exists(path): os.makedirs(path) for level1 in mlist: if not os.path.exists('%s/%s' % (path, level1)): os.mkdir('%s/%s' % (path, level1)) for level2 in mlist: if not os.path.exists('%s/%s/%s' % (path, level1, level2)): os.mkdir('%s/%s/%s' % (path, level1, level2))