b_e*_*erb 27 hash url-shortener
首先,我想确保我意识到这一事实,重新发布是一个明智的话题.但是我想听听你的一些意见,你会采取什么方法.
我正在构建一个分布式应用程序,其中节点远程创建由UUID标识的实体.最终,应该在专用的漏极节点处收集所有实体,该节点通过使用这些UUID来存储所有实体.
现在我想创建额外的标识符,这对人类用户来说更方便.编码UUID的Base64仍会创建22个字符的ID,这不适合人类使用.所以我需要像URL缩短服务这样的东西.应用双射函数无济于事,因为它们不会降低信息价值.当然,我知道我需要丢失信息才能缩短身份.而且我也知道任何哈希信息的减少都会增加冲突的可能性.我被卡住了,为了给人类创造更短的ID,减少信息的最合适的方法是什么.
以下是一些先决条件:我将提供通过我的数据存储映射{UUID,缩短ID}的功能.我仍然更喜欢非集中式解决方案.我可能永远不会需要超过大约一百万的ID(~2 ^ 20).
以下是我想到的想法:
还有其他方法吗?有利的是什么?
提前致谢!
Ste*_*dit 23
1)为了缩短UUID,您可以简单地将上半部分与底部进行异或(并重复直到它足够短).这将保留分布特征.像任何缩短输出的解决方案一样,它会增加因生日悖论而发生碰撞的可能性
2)XOR相当于一个简单的哈希,但由于不需要额外的混合,所以没关系.您可以在UUID上使用CRC或非加密哈希,但我不相信它有任何改进.
3)如果你愿意接受一些中央管理,那就不一定是痛苦的.中央权限可以向每个客户端发出中等大小的地址空间块,然后客户端可以在分配ID时遍历该子范围.这可以保证不会发生冲突,但也可以避免每个ID的往返.一种方法是使用32位整数作为ID,一次输出一个16位的块.换句话说,第一个客户端获得0001,这允许00010000到0001FFFF.
4)您可以使用UUID插入数据库,但也有一个标识字段.这将提供一个替代的,更紧凑的唯一ID,可以限制为32位int.
您是否考虑过使用外部别名方法,在这种方法中,您选择了一个人类友好术语的字典,并使用它们使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.