【发布时间】:2016-07-23 09:21:08
【问题描述】:
我正在寻找一种算法,它可以生成适合两者的标识符,例如外部使用。 URL 以及具有以下要求的持久性:
- 短,如最大值。 8 个字符
- URL 友好,因此没有特殊字符
- 人性化,例如没有像 L/l、0/O 这样的模棱两可的字符
- 增量用于快速索引
- 随机以防止在不知道算法的情况下猜测(会很好,但不重要)
- 独特,无需检查数据库
我查看了各种解决方案,但我发现所有解决方案都有一些重大的权衡。例如:
- GUID:太长,不是增量的
- GUID base64 编码:仍然太长,不是增量
- GUID ascii85 编码:短,不是增量,太多不合适的字符
- base32、base36 等 GUID 编码:短,但会丢失信息
- 梳子 GUID:太长,但增量
- 所有其他基于随机:需要检查数据库的唯一性
- 基于时间:在集群或多线程环境中容易发生冲突
编辑:为什么这被标记为离题?这些要求描述了一个可以提供许多合法解决方案的特定问题。事实上,这里的一些解决方案非常好,我正在努力选择一个标记为答案。
【问题讨论】:
-
根据定义它们不能既是随机的又是增量的!!
-
@MitchWheat 是的,这就是为什么我提到随机性并不那么重要
-
另外:“所有其他基于随机:需要检查数据库的唯一性”:如果它很长,那么您可以减少冲突(想想 GUID);如果它很短,那么如果您需要唯一性,则必须检查数据库。您有太多相互冲突的要求。
-
简短、独特、随机 - 选择任意两个。
-
同意@MitchWheat,你有太多相互冲突的要求。考虑到你有所有的要求,你有什么理由不能自己实现吗?您需要解决方案或建议吗?
标签: c# .net guid uniqueidentifier identifier