繁体   English   中英

在 Entity Framework/SQL 中生成唯一的随机非键值

[英]Generating a unique random non-key value in Entity Framework/SQL

我有一个预订应用程序,客户将在其中创建预订。 我不希望他们必须创建一个帐户并登录,所以他们将使用确认代码(如航空公司使用的)和信用卡的最后 4 个(再次,如航空公司)修改/查看他们的预订。 我的预订 class 已经有一个主键,一个 GUID,但是,我不想把它给客户,我想要一些更好看的东西,比如 6-8 位字母代码。

我正在使用 Entity Framework 和 C#/ASP.NET Core,虽然我可以在我的代码中生成值,但请检查 DB (MSSQL) 是否未使用该值,然后如果它是唯一的则保留,我宁愿如果可以的话,只做一次手术。 做这样的事情是让数据库生成值的公认方式还是有更多的 EF 方式来做这件事?

类似于双因素 (TOTP) 代码,但基于您的 GUID 而不是时间戳?

// userData should be populated with whatever immutable user data you want
// applicationSecret should be a constant
public string ComputeCode(byte[] userData, byte[] applicationSecret, int length)
{
    using var hashAlgorithm = new HMACSHA256(applicationSecret);
    var hash = hashAlgorithm.ComputeHash(userData);
    return BitConverter.ToString(hash).Replace("-", "").Substring(0, length);
}

我无法谈论您问题中与 EF 相关的方面,但我最近不得不想出一种方法来为个人项目生成唯一的、用户友好的 ID。

我最终确定的是以下内容:

  1. 从 32 位 integer 开始。(在我的例子中,它是一个递增的数据库 ID。)
  2. 使用块大小为 32 位的RC5 “加密”integer。 这打乱了密钥空间。 您可能必须编写自己的 RC5 实现,但这是一个简单的算法。 (我的是 <100 行 python。)
  3. Base32中对生成的 4 个字节进行编码。 我推荐 z-base-32 作为最用户友好的字母表。 您可能必须编写自己的 Base32 实现,但同样,它非常简单。

该算法产生类似于以下的可逆映射:

1 <-> "4zm5cna"
2 <-> "5ytgepe"
3 <-> "e94rs4e"
etc.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM