如何从文件路径生成最短的(alpha)数字唯一ID?

时间:2013-11-27 16:58:38

标签: python uniqueidentifier sha

我希望根据Python中的文件路径生成数字或字母数字(以较容易为准)的唯一ID。我正在研究一个文件解析应用程序,并且DB中有一个带有后代的文件实体,为了拥有比文件的完全限定路径更紧凑的外键/主键,我想将它转换为最短的尽可能独特的消化。

我有什么选择呢?我可以使用SHA吗?

如果我从完全限定的路径字符串中取出MD5校验和并获得类似1736622845的内容怎么样?在命令行上,可以使用

完成
echo -n '/my/path/filename' | cksum | cut -d' ' -f1 

这保证永远不会重复两个不同的输入吗?如果是,我如何将上述bash管道命令转换为纯Python,以便我不必调用系统调用但获得相同的值?

1 个答案:

答案 0 :(得分:2)

字符串的最短唯一ID是字符串。 您可以尝试使用仅包含路径中允许的字符的字母表,这样您就可以使用更少的位(很多工作,而不是很多好处,除非您的路径实际上只包含几个字符)

我认为你想要的是一个相当不错的短哈希函数。一旦生成哈希函数,就有发生冲突的风险。对于大多数散列函数,一个好的经验法则是您的条目少于散列值空间。有一个定理证明,只要你有超过sqrt(key_space)个条目,你就会(最好的哈希值)在一半时间内发生碰撞。

因此,如果你采用1000条路径,那么你应该以至少1.000.000个条目的哈希速度为目标。你可以切断其他哈希函数(比如只占用md5的前2个字节)。这应该有效,但请注意碰撞的增加(其中2个条目将生成相同的值)。

此外,如果您非常热衷于节省空间,请将哈希值存储在二进制(大型int)中。它比通常的编码(base64或hex)短得多,并且所有数据库函数都可以正常工作。

所以说你拿md5并将它存储为一个大的int,它只需要16个字节来存储。但是你也可以只使用8或4(我不敢低于那个)。