生成/压缩唯一键

时间:2012-01-25 11:53:16

标签: algorithm hash compression

在我的工作中,我有很多用户,每个用户都有主目录中的文件集。由于一些预先定义的规则,我根据用户文件内容及其创建时间为每个文件提供了UID(唯一标识)。但现在我开始知道用户帐户中的文件数量不能超过100万。当前的UID大约是32个字符。是否有任何方法可以将我的UID降低到约6(理想条件)字符到大约10-12个字符长,因为当前的uidl在我的NoSQL数据库中占用了大量空间。

目前的uidl看起来像 timestamp.prrocess_whichcreated_it.size

修改 让我重新解释一下这个问题。我真正需要的是一个压缩算法: 例如,

我有1,000,000个字符串(每个字符串)的列表,每个字符长32个字符。我需要一个压缩函数f,这样F(string)= s2,其中S2长度为10个字符,所有S2字符串都是唯一映射的

3 个答案:

答案 0 :(得分:1)

对你的UID进行排序,并用一个新的UID替换旧的UID,指示旧UID的排序数组中的索引

简化的伪代码应如下所示:

sorted <- sort(UID's)
for each file:
  file.UID <- sorted.indexOf(file.UID)

答案 1 :(得分:1)

很难将UNIQUE id压缩并保持独特。你往往会遇到碰撞。

@ amit的建议确实是最好的。也许他的实施有点滑稽。

如何使用AUTO INCREMENTING INTEGER“ID”列和字符串/ varchar“OldGUID”创建表。将所有旧/当前GUID插入到表中,现在GUID与较短/压缩的“ID”之间存在一对一的匹配。当你创建新的GUID时,只需将它们插入到表中,你就可以继续进行1对1的匹配,这样你就可以在长版和短版之间来回切换。

答案 2 :(得分:0)

如果您只需要一个唯一标识符,那么我首先想到的是UUID

但是,通用UUID将消耗16个字节,并且是二进制格式。它不会满足您对6个字符的要求。与使用32个字符的当前方法相比,它“仅”节省了50%的空间。

因此,较温和的方案是使用具有通用哈希函数的64位UID(8字节)。利用良好的散列,只要生成的UID的总数低于&lt; 1亿。如果这似乎可以接受,那么8字节似乎非常接近你的空间要求。