gpt4 book ai didi

c# - 如何生成唯一订单号?

转载 作者:太空狗 更新时间:2023-10-29 18:00:39 28 4
gpt4 key购买 nike

我正在寻找一种生成唯一订单 ID 的好方法。你能看出下面代码有什么问题吗?

int customerId = 10000000;

long ticks = DateTime.UtcNow.Ticks;

long orderId = customerId + ticks;

int orderNumber = orderId.GetHashCode();

我将在创建订单之前检查数据库中的号码是否唯一。

最佳答案

如果您将记录存储在数据库中,您应该认真研究那里可用的功能以生成唯一的代理键。在 SQLServer 中,这将是一个 IDENTITY。字段,在 Oracle 中它将是一个使用 SEQUENCE 的字段产生新的值(value)。

如果有令人信服的理由说明您不能使用数据库生成唯一 key ,您应该查看类似 Guid 的内容 - 这比日期时间操作更有可能生成唯一值。 Guid 可以简单地转换为字符串,因此在这种情况下您的标识符将是一个字符串。

你用散列做的事情不是一个好主意 - 没有什么可以保证散列是唯一的 - 在许多情况下它们确实会发生冲突。 Guids - 不要提供 100% 的唯一性保证跨机器,但在一台机器上它们应该始终是唯一的。甚至跨机器,它们发生碰撞的可能性也极小。此外,使用机器时间作为建立基础值(value)的方式受制于竞争条件(如 Eric 所描述的那样)。

Guid 是 128 位值,因此您不能将它们表示为简单的 intlong。这将要求您使用字符串作为您的 ID,这在您的情况下可能可行也可能不可行,具体取决于其他考虑因素(例如您是否控制数据模型)。如果可以使用它们,使用 Guid 真的很容易:

string customerId = Guid.NewGuid().ToString(); // fetch new guid and save as string
string orderNumber = Guid.NewGuid().ToString(); // same story here...

如果您真的必须使用数字标识符,并且愿意放弃轻松地跨多个服务器扩展应用程序,则可以使用自动递增的全局数字来提供唯一键。您会当应用程序启动时,必须使用数据库中的下一个可用值 (max+1) 为该数字设置种子。然后,您还必须保护该值不被多个线程并发使用。我会把这个责任包装在一个类中:

class static UniqueIDGenerator 
{
// reads Max+1 from DB on startup
private static long m_NextID = InitializeFromDatabase();

public static long GetNextID() { return Interlocked.Increment( ref m_NextID ); }
}


编辑: 在当今时代,在您的应用程序层而不是在数据库中生成唯一 ID 的令人信服的理由非常少见。您应该真正使用数据库提供的功能。

关于c# - 如何生成唯一订单号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267165/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com