客观的
生成一个唯一的 16 字符密钥,用作批次名称,不需要任何类型的存储(例如唯一计数器)。
背景
我有一个每 30 秒运行一次的 Windows 服务。我从 MQ 中提取消息并批量处理它们。我正在进行的服务调用之一是现在需要一个 16 个字符的批次名称。他们不在乎批次名称是什么,它只需要在所有批次中都是唯一的。
问题
如果我生成一个Guid
,我可以使用该字符串的前 16 个字符还是后 16 个字符,并且它仍然是唯一满足我的需要的?
生成一个唯一的 16 字符密钥,用作批次名称,不需要任何类型的存储(例如唯一计数器)。
我有一个每 30 秒运行一次的 Windows 服务。我从 MQ 中提取消息并批量处理它们。我正在进行的服务调用之一是现在需要一个 16 个字符的批次名称。他们不在乎批次名称是什么,它只需要在所有批次中都是唯一的。
如果我生成一个Guid
,我可以使用该字符串的前 16 个字符还是后 16 个字符,并且它仍然是唯一满足我的需要的?
不。
Raymond Chen 详细解释了为什么GUID 是全局唯一的,但 GUID 的子字符串不是。
但是,如果您在一台机器上运行它,那么您不需要您的 ID 是全局唯一的 - 只需在本地唯一。因此,您可以从他描述的 GUID 算法中删除 MAC 地址要求。另外,如果你知道每 30 秒只会生成一个,你可以放弃算法的碰撞部分。这几乎让您使用 qujck 建议的日期时间。
不,是简单的答案。为什么不使用日期/时间?
例如,这里有一些 Oracle 生成的 GUID
D71CDF38BB3B6026E0430A9A9A286026
D71CDF38BB3C6026E0430A9A9A286026
D71CDF38BB3D6026E0430A9A9A286026
D71CDF38BB3E6026E0430A9A9A286026
D71CDF38BB3F6026E0430A9A9A286026
D71CDF38BB406026E0430A9A9A286026