gpt4 book ai didi

c# - 生成用户友好的字母数字 ID(如业务 ID、SKU)的选项有哪些

转载 作者:可可西里 更新时间:2023-11-01 03:07:27 25 4
gpt4 key购买 nike

要求如下:

必须是字母数字,8-10 个字符,以便于用户使用。这些将作为唯一键存储在数据库中。我将 Guid 用作主键,因此最好选择使用 GUId 生成这些唯一 ID。

我正在考虑采用 Guid 并将其转换为 8 个字符的唯一字符串的 base-n 转换器。

首选简短、轻量级的算法,因为它会被经常调用。

最佳答案

8 characters - perfectly random - 36^8 = 2,821,109,907,456 combinations
10 characters - perfectly random - 36^10 = 3,656,158,440,062,976 combinations
GUID's - statistically unique* - 2^128 = 340,000,000,000,000,000,000,000,000,000,000,000,000 combinations

* Is a GUID unique 100% of the time? [stackoverflow]

你的GUID -> 字符转换的问题;虽然您的 GUID 在统计上是唯一的,但通过采用任何子集,您会降低随机性并增加碰撞的机会。您当然不想创建非独特的 SKU。


解决方案一:

使用与对象和业务规则相关的数据创建 SKU。

即可能有一小部分属性组合使对象独一无二 (a natural key) 。组合自然键的元素,对它们进行编码和压缩以创建一个 SKU。通常您只需要一个日期时间字段(即 CreationDate)和一些其他属性即可实现此目的。您在创建 sku 时可能会有很多漏洞,但 sku 与您的用户更相关。

假设:

Wholesaler, product name, product version, sku
Amazon, IPod Nano, 2.2, AMIPDNN22
BestBuy, Vaio, 3.2, BEVAIO32

解决方案 2:

一种保留一系列数字,然后按顺序释放它们的方法,并且永远不会返回相同的数字两次。您仍然可以在范围内找到漏洞。虽然您可能不需要生成足够的 sku 来解决问题,但请确保您的要求允许这样做。

一个实现是在一个有计数器的数据库中有一个 key 表。计数器在事务中递增。重要的一点是,软件中的方法不是递增 1,而是抓取一个 block 。伪c#代码如下。

-- what the key table may look like
CREATE TABLE Keys(Name VARCHAR(10) primary key, NextID INT)
INSERT INTO Keys Values('sku',1)

// some elements of the class
public static SkuKeyGenerator
{
private static syncObject = new object();
private static int nextID = 0;
private static int maxID = 0;
private const int amountToReserve = 100;

public static int NextKey()
{
lock( syncObject )
{
if( nextID == maxID )
{
ReserveIds();
}
return nextID++;
}
}
private static void ReserveIds()
{
// pseudocode - in reality I'd do this with a stored procedure inside a transaction,
// We reserve some predefined number of keys from Keys where Name = 'sku'
// need to run the select and update in the same transaction because this isn't the only
// method that can use this table.
using( Transaction trans = new Transaction() ) // pseudocode.
{
int currentTableValue = db.Execute(trans, "SELECT NextID FROM Keys WHERE Name = 'sku'");
int newMaxID = currentTableValue + amountToReserve;
db.Execute(trans, "UPDATE Keys SET NextID = @1 WHERE Name = 'sku'", newMaxID);

trans.Commit();

nextID = currentTableValue;
maxID = newMaxID;
}
}

这里的想法是您保留足够的键,这样您的代码就不会经常进入数据库,因为获取键范围是一项昂贵的操作。您需要很好地了解需要保留的 key 数量,以平衡 key 丢失(应用程序重启)与过快耗尽 key 并返回数据库之间的关系。这个简单的实现无法重用丢失的 key 。

由于此实现依赖于数据库和事务,因此您可以让应用程序同时运行并且所有应用程序都生成唯一 key ,而无需经常访问数据库。

请注意,以上内容大致基于 key table,来自 Patterns of Enterprise Application Architecture (Fowler) 的第 222 页。该方法通常用于在不需要数据库标识列的情况下生成主键,但您可以了解如何根据您的目的对其进行调整。

关于c# - 生成用户友好的字母数字 ID(如业务 ID、SKU)的选项有哪些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217253/

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