如何生成唯一的订单号?

2023-12-29

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

int customerId = 10000000;

long ticks = DateTime.UtcNow.Ticks;

long orderId = customerId + ticks;

int orderNumber = orderId.GetHashCode();

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


如果您将记录存储在数据库中,您应该真正研究数据库中可用于生成唯一代理键的功能。在 SQLServer 中,这将是IDENTITY http://msdn.microsoft.com/en-us/library/aa933196%28SQL.80%29.aspx字段,在 Oracle 中它将是一个使用SEQUENCE http://www.techonthenet.com/oracle/sequences.php来产生新的价值。

如果有令人信服的原因导致您无法使用数据库生成唯一密钥,那么您应该查看类似Guid http://msdn.microsoft.com/en-us/library/system.guid.aspx- 比日期时间操作更有可能生成唯一值。指南可以简单地转换为字符串,因此在这种情况下您的标识符将是一个字符串。

你对哈希所做的事情不是一个好主意- 没有什么可以保证哈希值是唯一的 - 在许多情况下它们确实会发生冲突。指南 - 不提供 100% 的唯一性保证跨机器但在一台机器上它们应该始终是唯一的。即使是跨机器,它们发生碰撞的可能性也极小。此外,使用机器时间作为构建基础价值的方式会受到竞争条件的影响(就像埃里克所描述的那样)。

Guid 是 128 位值,因此您不能将它们表示为简单的int or long。它需要您使用字符串作为您的 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 ); }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何生成唯一的订单号? 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 设置 UINavigationController 时“无法对类型进行比较查询:(null)”

    我的应用程序在应用程序委托中崩溃 它抛出的错误是 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 无法对类型进行比较查询 null 我的代码如下 我保留了日志语句 以便您可以看到我在哪里检查了内
  • 如何将图像放入 Realm 数据库中?

    我正在使用 Swift 2 编写一个 iOS 应用程序 我想将帐户的个人资料图片保存在本地 Realm 数据库中 我找不到任何文档或人们谈论这一点 是否可以 如何 这样做可能不好吗 您可以将图像存储为NSData 假设您有要在本地存储的图像
  • C++非常量静态成员变量的初始化?

    我收到成员变量 objectCount 的限定错误 编译器还返回 ISO C 禁止非常量静态成员的类内初始化 这是主要的类 include
  • ffmpeg concat错误无法找到合适的输出格式

    我正在尝试将一个片尾视频批量连接到多个视频 我只是使用以下命令来测试它 ffmpeg i test mp4 i hello mp4 filter comp lex 0 v 0 0 a 0 1 v 0 1 a 0 concat n 2 v 1
  • 测试 C++ 代码的字节序无关性

    如何测试或检查 C 代码的字节序无关性 它已经实施了 我只想verify它适用于小端和大端平台 我可以编写单元测试并在目标平台上运行它们 但我没有硬件 也许模拟器 是否可以进行编译时检查 如果您可以使用基于 x86 的 Mac 那么您可以利
  • 在 if 条件下批处理多个操作

    有没有办法在 if 条件下放置多个操作 像这样 if not exist MyFolderName ECHO create a folder mkdir MyFolderName 您可以使用 连接命令并在同一行执行它们 所以你的语法应该是这
  • 添加 TabView 使导航栏不覆盖 SwiftUI 中的安全区域

    在我的 SwiftUI iOS 应用程序中添加 TabView 时 导航栏不再覆盖凹口 我尝试为 TabView 实现创建另一个文件 修改 SceneDeletage 等 这是一个没有 TabView 的简单代码 使导航栏覆盖安全区域 又名
  • python:为什么 IDLE 比终端慢?

    我刚刚编写了一个简单的 python 命令来检查 csv 文件中的大列表 csv 有 2 列和 10K 行 当我将第二行输入到列表中并稍后打印列表时 IDLE 需要相当长的时间才能显示终端 在 Mac 下 立即显示它的位置 顺便说一句 我在
  • 如何处理 Facebook 新的 UID 大小?

    我在 Facebook 应用程序上做了一些工作 但是当我注册一个新用户来测试朋友交互时 新用户获得了一个 uid 100000XXXXXXXXX 对于 php 来说处理起来似乎太大了 将数字保存到数据库中会产生相同的值 2147483647
  • 在 Umbraco 7 中使用 html 页面作为自定义部分,无需树

    我有一个 HTML 页面 想要在 Umbraco 7 的自定义部分中显示 我想在该部分中不包含任何树的情况下执行此操作 因为所有内容都已在 html 文件中处理 它被放置到 Umbraco 后端以方便访问 到目前为止 我已经实现了 IApp
  • Webpack style-loader / css-loader:url() 路径解析不起作用

    有一些关于的帖子style loader and css loader 但尽管如此 我仍然无法找到解决我的问题的方法 简而言之 当我 import css其他文件中的文件css文件 以及导入的css包含url 如果使用相对路径 则路径无法正
  • 删除 iOS/WebKit 文本区域中的 3 个像素

    我正在尝试创建一个textarea看起来完全像div 然而 在 iOS 上 有 3 个像素来自我无法删除的地方 这是我的代码 div test div hr
  • nginx默认无法打开index.php

    我的服务器定义有什么问题 如果我尝试访问 www testing com 我会下载一个二进制文件而不是index php 而如果我尝试访问 testing com 我会下载index php 我已经尝试将服务器名称设置为 servernam
  • 如何在文件中传递超过9个参数。 htaccess(mod_rewrite)?

    我在使用 mod rewrite apache 在 htaccess 文件中使用超过九个参数时遇到麻烦 例如 如果我传递参数 10 something mod rewrite 传递参数 1 的值 对此有什么解决方案吗 答案很简单 你不能 h
  • 最佳 Common Lisp IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我可以使用 CMake 创建 XCode (OCUnit) 的 iOS 单元测试目标吗?

    我目前使用 CMake 为静态库和应用程序目标创建 iOS xcode 项目 现在也想从 CMake 创建单元测试目标 但尚未找到有关 CMake 是否支持此功能或如何创建 octest 目标的任何资源 我可以从 CMake 创建这个吗 如
  • 如何在linux中为sed命令设置临时文件目录?

    我有 bash 脚本 它修改了这样的文件 sed i hello world d etc postfix virtual 我从网络应用程序运行了这个脚本 sed 命令在该目录中创建临时文件 但 Web 应用程序运行的用户没有在该目录中创建文
  • 用户“root”已超出“max_questions”资源(当前值:1)

    您好 我正在使用 MySQL Workbench 并且我不小心将 root 用户的 max questions 设置为 1 现在我已注销 并且无法登录 我等了 1 小时 但在测试连接时仍然收到错误 User root has超过 max q
  • Scala:以高效的方式将字符串迭代器写入文件

    我有数千个文件 50K 每个文件大约有 10K 行 我读取文件并进行一些处理 然后将这些行写回输出文件 虽然我的读取和处理速度更快 但将字符串迭代器转换回单个字符串并将其写入文件的最后一步需要很长时间 几乎一秒钟 我不会为整个过程进行数学计
  • 如何生成唯一的订单号?

    我正在寻找一种生成唯一订单 ID 的好方法 你能看出下面的代码有什么问题吗 int customerId 10000000 long ticks DateTime UtcNow Ticks long orderId customerId t