我正在构建一个分布式应用程序,在其中节点远程创建由UUID标识的实体。最终,所有实体都应该聚集在专用的drain节点上,该节点使用这些UUID存储所有实体。
现在,我想创建更适合人类用户的附加标识符。将UUID进行Base64编码仍然会创建具有22个字符的ID,这对于人类使用不合适。因此,我需要类似于URL缩短服务的东西。应用双射函数不会有所帮助,因为它们不会减少信息价值。当然,我知道我需要失去信息才能缩短ID。我也知道,任何哈希的信息减少都会增加碰撞的可能性。
我陷入了困境,最适合的方法是缩短人类ID的信息。
以下是一些先决条件:我将提供通过我的数据存储映射{UUID,缩短的ID}的能力。我仍然更喜欢非集中式的解决方案。我可能永远不需要超过大约一百万个ID(~2 ^ 20)。
我想到的一些想法如下:
- 自动增加的ID:如果我使用某种自动增加的ID,我可以将此ID转换为模糊的字符串并传递这个ID。这将是最简单的方法,只要周围没有太多的键,键就不会很长。但是我必须引入一个集中式实体,而我并不真正想要。 - 缩短UUID:我可以只取原始128位UUID的一些位。然后我应该至少考虑UUID的版本。或者还有其他什么问题吗? - 重新哈希UUID:我可以在我的初始UUID上应用第二个哈希算法,并存储映射。
还有其他方法吗?哪种方法更好?
提前感谢!
Guid.ToByteArray()
方法获取一个16字节的数组。然后可以使用^
运算符对字节进行异或操作。如果需要32位的输出,需要将每组四个输入字节合并为一个输出字节。我建议交错排列,以便第一个输出字节来自偏移量0、4、8和12的组合。以此类推。 - Steven Sudit