缩短/重组UUID

b_e*_*erb 27 hash url-shortener

首先,我想确保我意识到这一事实,重新发布是一个明智的话题.但是我想听听你的一些意见,你会采取什么方法.

我正在构建一个分布式应用程序,其中节点远程创建由UUID标识的实体.最终,应该在专用的漏极节点处收集所有实体,该节点通过使用这些UUID来存储所有实体.

现在我想创建额外的标识符,这对人类用户来说更方便.编码UUID的Base64仍会创建22个字符的ID,这不适合人类使用.所以我需要像URL缩短服务这样的东西.应用双射函数无济于事,因为它们不会降低信息价值.当然,我知道我需要丢失信息才能缩短身份.而且我也知道任何哈希信息的减少都会增加冲突的可能性.我被卡住了,为了给人类创造更短的ID,减少信息的最合适的方法是什么.

以下是一些先决条件:我将提供通过我的数据存储映射{UUID,缩短ID}的功能.我仍然更喜欢非集中式解决方案.我可能永远不会需要超过大约一百万的ID(~2 ^ 20).

以下是我想到的想法:

  • 自动递增的ID:如果我使用某种自动递增的ID,我可以将此id转移到混淆的字符串并传递它.这将是最简单的方法,只要周围的键很少,键就不会很长.但是,我必须引入一个我不想要的集中实体.
  • 缩短UUID:我可以只取一些原始的128位uuid.然后我应该至少考虑UUID的版本.或者这有什么不对吗?
  • 重新划分UUID:我可以在我的初始UUID上应用第二个哈希算法并存储映射.

还有其他方法吗?有利的是什么?

提前致谢!

Ste*_*dit 23

1)为了缩短UUID,您可以简单地将上半部分与底部进行异或(并重复直到它足够短).这将保留分布特征.像任何缩短输出的解决方案一样,它会增加因生日悖论而发生碰撞的可能性

2)XOR相当于一个简单的哈希,但由于不需要额外的混合,所以没关系.您可以在UUID上使用CRC或非加密哈希,但我不相信它有任何改进.

3)如果你愿意接受一些中央管理,那就不一定是痛苦的.中央权限可以向每个客户端发出中等大小的地址空间块,然后客户端可以在分配ID时遍历该子范围.这可以保证不会发生冲突,但也可以避免每个ID的往返.一种方法是使用32位整数作为ID,一次输出一个16位的块.换句话说,第一个客户端获得0001,这允许00010000到0001FFFF.

4)您可以使用UUID插入数据库,但也有一个标识字段.这将提供一个替代的,更紧凑的唯一ID,可以限制为32位int.


Chr*_*bek 8

您是否考虑过使用外部别名方法,在这种方法中,您选择了一个人类友好术语的字典,并使用它们使UUID(的一部分)更具可读性:

de305d54-75b4-431b-adb2-eb6b9e546013
Run Code Online (Sandbox Code Playgroud)

使用65536个单词的字典可能会变成:

de305d54-zebra-stackoverflow-extraneous-eb6b9e546013
Run Code Online (Sandbox Code Playgroud)

用户不太可能看到这些人类可读名称的精神哈希冲突(斑马发生两次),并且您的数据库的大小不会增加.翻译是双向的,纯粹是UI.