Algorithm 生成/压缩唯一密钥

Algorithm 生成/压缩唯一密钥,algorithm,hash,compression,Algorithm,Hash,Compression,在我的工作中,我有许多用户,每个用户都在主目录中有一组文件。由于一些预定义的规则,我根据用户文件内容及其创建时间为每个文件指定了一个UID(唯一标识)。但现在我知道用户帐户中的文件数不能超过100万。当前UID的长度约为32个字符。如果当前uidl在我的NoSQL数据库中占用大量空间,是否有任何方法可以将UID减少到大约6个字符(理想条件)到大约10-12个字符 当前uidl看起来像 timestamp.prprocess\u创建的\u it.size 编辑 让我重新解释一下这个问题。我真正需要

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

当前uidl看起来像 timestamp.prprocess\u创建的\u it.size

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


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

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

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

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

sorted获取唯一的id很难压缩它并保持它的唯一性。你容易遇到碰撞

@埃米特的建议真的是最好的。也许他的实现有点油嘴滑舌


创建一个具有自动递增整数“ID”列和字符串/varchar“OldGUID”的表怎么样。将所有旧的/当前的GUID插入表中,现在GUID和较短的/压缩的“ID”之间有了1对1的匹配。创建新的GUI时,只需将它们插入表中,就可以继续进行1对1的匹配,这样就可以在长版本和短版本之间来回切换。

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

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


因此,更温和的方案是使用64位UID(8字节)和通用哈希函数。使用良好的哈希,只要生成的UID总数小于1亿,冲突概率就相当合理。如果这看起来可以接受,那么8字节似乎非常接近您的空间需求。

您是否在寻找一个哈希函数,该函数将在每次查找UID时运行,或者是一种方法来将这些UID更改为更小的新范围?@amit:我只想压缩我以前的UID,如果我可以在任务中使用当前UID就好了,但如果我能计算出新的,那也很好。理想情况下H(C.UIDL)=newuidl那么为什么不进行排序和替换呢?对所有UID进行排序,并将旧UID替换为新UID,指示排序列表中旧UID的索引。它将是独特的和最佳的。还是我错过了你真正的意思|@埃米特:看起来是个好主意。我想应该行得通:)当时我把它作为一个答案加上去了。我不确定我是否正确理解了你的问题。很高兴我这么做了:)不能这样做:我应该总是从以前的uid中获取新的uid。因此,我需要一个像say H(prev)=newuid,bcz这样的函数,我不能仅仅更改以前的数据,因为它存在于多个位置