Python 如何从文件路径生成尽可能短的(字母)数字唯一ID?
我想在Python 如何从文件路径生成尽可能短的(字母)数字唯一ID?,python,uniqueidentifier,sha,Python,Uniqueidentifier,Sha,我想在Python中生成数字或字母数字(以较容易的为准)唯一ID作为文件路径的函数。我正在开发一个文件解析应用程序,数据库中有一个带有子体的文件实体,为了使外键/主键比文件的完全限定路径更紧凑,我希望将其转换为尽可能短的唯一摘要 我的选择是什么?我可以使用SHA吗 如果我只是从完全限定路径字符串中取出一个MD5校验和,得到类似1736622845的值,会怎么样?在命令行上,可以使用 echo -n '/my/path/filename' | cksum | cut -d' ' -f1 对于两
Python
中生成数字或字母数字(以较容易的为准)唯一ID作为文件路径的函数。我正在开发一个文件解析应用程序,数据库中有一个带有子体的文件实体,为了使外键/主键比文件的完全限定路径更紧凑,我希望将其转换为尽可能短的唯一摘要
我的选择是什么?我可以使用SHA吗
如果我只是从完全限定路径字符串中取出一个MD5校验和,得到类似1736622845的值,会怎么样?在命令行上,可以使用
echo -n '/my/path/filename' | cksum | cut -d' ' -f1
对于两个不同的输入,是否保证不会重复?如果是,我如何将上面的
bash
管道命令转换为纯Python,这样我就不必调用系统调用,而是获得相同的值?字符串的最短唯一ID是字符串。
您可以尝试使用只包含路径中允许的字符的字母表,以便使用更少的位(这需要大量工作,不会带来很多好处,除非您的路径实际上只包含几个字符)
我认为您需要的是一个相当好的短散列函数。一旦生成哈希函数,就会有冲突的风险。对于大多数散列函数,一个很好的经验法则是,您拥有的条目远远少于散列值空间。有一个定理可以证明,只要你有超过sqrt(key\u space)
的条目,你就会(用最好的散列)有一半的时间发生冲突
因此,如果您选择1000条路径,那么您的目标应该是使用至少1.000.000个条目的散列速度。您可以切碎其他哈希函数(比如只取md5的前2个字节)。这应该是可行的,但请注意冲突的增加(其中两个条目将生成相同的值)
此外,如果您非常希望节省空间,请将哈希值存储为二进制(大整数)。它比通常的编码(base64或hex)要短得多,所有的DB函数都可以正常工作
假设您使用md5并将其存储为一个大整数,则只需16个字节即可存储。但您也只能使用8或4(我不敢再低了)。您可以使用
导入uuid;uuid.uuid4()
fot.我怀疑uuid
在大小方面是否是最优的您可以通过只取第一个N
字符来缩短uuid
。我认为从SHA或MD5
生成哈希对您来说太长了(32字节)。可以吗,但校验和非常昂贵,可能需要很长的时间和硬件。