Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从文件路径生成尽可能短的(字母)数字唯一ID?_Python_Uniqueidentifier_Sha - Fatal编程技术网

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字节)。可以吗,但校验和非常昂贵,可能需要很长的时间和硬件。