C# 生成独特的&;SQL Server和.NET中的Randon代码

C# 生成独特的&;SQL Server和.NET中的Randon代码,c#,sql-server,C#,Sql Server,我需要在C#/ASP.NET中生成一个在SQL Server数据库中必须是唯一的半随机代码 这些代码需要批量生成,每次运行最多生成100个代码 考虑到这些需求,我不确定如何在不生成代码然后检查数据库是否存在的情况下做到这一点,这似乎是一种可怕的做法 以下是要求: 最多10个字符(仅字母数字) 不能区分大小写 用户可以为代码指定可选的3个字符前缀 不得违反数据库中的2列唯一约束,即必须是“类别”中唯一的“代码文本”(constraint ucCodes unique(ColumnCodeText

我需要在C#/ASP.NET中生成一个在SQL Server数据库中必须是唯一的半随机代码

这些代码需要批量生成,每次运行最多生成100个代码

考虑到这些需求,我不确定如何在不生成代码然后检查数据库是否存在的情况下做到这一点,这似乎是一种可怕的做法

以下是要求:

  • 最多10个字符(仅字母数字)
  • 不能区分大小写
  • 用户可以为代码指定可选的3个字符前缀
  • 不得违反数据库中的2列唯一约束,即必须是“类别”中唯一的“代码文本”(
    constraint ucCodes unique(ColumnCodeText,ColumnCategoryId)
因此,考虑到10个字符的限制,guid不是一个选项。考虑到不区分大小写的要求,我认为数据库冲突的数学概率相当高

同时,有足够多的可能组合,我认为DB中的直接查找表是禁止的


是否有一种性能合理的方法可以生成符合这些要求的代码,而不需要每次将一个代码保存到DB,然后等待唯一的密钥冲突来查看是否通过?

这里有两种选择

  • 您可以生成一个新ID并将其插入。如果它抛出dup唯一密钥异常,请重试,直到成功为止,或者在ID用完时退出。如果大部分ID都用完了,性能会很差
  • 预生成所有可能的ID并将其存储在表中。无论何时需要获取一个,您都可以从随机行索引中删除一个,并将其用作ID。数据库将为您处理并发性,以确保其唯一性。如果给出了前三个字母,则可以简单地添加where子句以限制行与该约束匹配
    这种奇怪的代码要求的商业目的是什么?在其他方面,它似乎违反了1NF,在值上粘贴了一个可选前缀。然后是与“随机”字符串相关的所有疯狂的东西。在长度为10的情况下,为了避免使用像sh1th0use这样的单词和其他形式的字符,有大量的工作没有提到。像这样的代码生成有很多问题。是的,可能都是公平的,但他们想要他们想要的。我已经提供了多种替代方案和更明智的解决方案,并且没有说“我不这么做,因为它有200个潜在问题”,我需要找到一种方法来满足需求。为了更直接地回答您的问题,业务需求是“我们知道我们的客户只能处理这种特定形状的键入和跟踪代码,所以这就是他们需要的外观”。