【问题标题】:How to generate the shortest possible (alpha)numeric unique ID out of a file path?如何从文件路径中生成最短的(字母)数字唯一 ID?
【发布时间】:2013-12-13 10:52:01
【问题描述】:

我想根据Python 中的文件路径生成数字或字母数字(以更容易者为准)的唯一 ID。我正在开发一个文件解析应用程序,并且数据库中有一个带有后代的文件实体,为了拥有比文件的完全限定路径更紧凑的外键/主键,我想将其转换为最短的尽可能唯一的摘要。

我有哪些选择来做到这一点?我可以使用SHA吗?

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

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

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

【问题讨论】:

  • 你可以使用import uuid; uuid.uuid4()
  • 我怀疑 UUID 在大小方面是最佳的
  • 您可以缩短UUID,只取第一个N 字符。
  • 我认为从SHA or MD5 生成哈希对你来说太长了(32 字节)。
  • 可以,但是校验和非常昂贵,可能需要很长时间和硬件。

标签: python uniqueidentifier sha


【解决方案1】:

字符串的最短唯一 ID 是字符串。 您可以尝试使用只包含路径中允许的字符的字母表,这样您就可以使用更少的位(工作量很大,没有太多好处,除非您的路径真的只包含几个字符)

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

因此,如果您采用 1000 条路径,您应该以至少 1.000.000 个条目的哈希速度为目标。您可以切碎其他散列函数(比如只取 md5 的前 2 个字节)。这应该可行,但请注意冲突的增加(其中 2 个条目将生成相同的值)。

此外,如果您非常想节省空间,请将哈希值存储为二进制(大整数)。它比通常的编码(base64 或 hex)短得多,并且所有 DB 函数都应该可以正常工作。

假设你把 md5 存储为一个大的 int,它只需要 16 个字节来存储。但是你也只能使用 8 或 4(我不敢低于那个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多