【问题标题】:I want to generate unique ID我想生成唯一 ID
【发布时间】:2021-05-16 04:54:12
【问题描述】:

我想在 JavaScript 中生成唯一 ID。我试过 uuid npm 包,很好但是不是我想要的。

例如,我从 uuid 包生成唯一 ID 得到的结果是

9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

有没有什么方法可以制作出我想要的特定格式。

例如,我希望我的 ID 看起来像这样

XZ5678

在此示例中,格式为两个大写字母和 4 个数字。

就是这样,我正在寻找答案,并提前谢谢大家。

【问题讨论】:

  • 您是否尝试过编写自己的解决方案?没有您的帮助,我们无法提供代码。
  • 对于数字部分,在后备数据库中将 ID 生成为递增整数可能是最简单的。相反,您可能会在该数据库中寻找解决方案,以了解如何在此类标识符中包含字母。
  • 大卫说得对。 UUID 是唯一的,因为几乎不可能生成重复。但是保证XZ5678 方案的唯一性是困难的,因为只有大约 700 万个可能的值。仅生成 370 个 ID 后,重复的几率为 1/100。 1200后,1/10!
  • 我还没有尝试任何解决方案。我参与了我的项目架构的制作。这将是一个小型的前端项目,因为我刚刚学习了 JS,在此之前我做了 1 个。用户将能够在此应用程序中创建发票。并且发票不能与一些已经存在的发票具有相同的 ID。所以我不在乎多个用户是否为某些发票获得相同的 ID。要点是,对于具有相同 ID 的用户,不应有 2 张发票。将没有数据库,创建的发票将存储在浏览器的本地存储中。这只是炫耀项目,我怀疑有人会创建 100 张发票。
  • 您能否将其基于用户 ID、发票记录 ID 和/或日期?

标签: javascript package unique uuid


【解决方案1】:

如果您只是想根据该模式生成随机序列,您可以相对轻松地做到这一点。为确保它是唯一的,您需要运行此函数,然后将其与之前生成的 ID 表进行匹配,以确保它尚未被使用。

在下面的示例中,我创建了两个函数,getRandomLetters()getRandomDigits(),它们返回传递给函数的参数长度的数字和字母字符串(默认长度为 1)。

然后,我创建了一个名为 generateUniqueID() 的函数,它根据您指定的格式生成一个新 ID。它检查该 ID 是否已存在于现有 ID 表中。如果是这样,它会进入一个 while 循环,循环直到创建一个新的唯一 ID,然后返回它的值。

const existingIDs = ['AA1111','XY1234'];
const getRandomLetters = (length = 1) => Array(length).fill().map(e => String.fromCharCode(Math.floor(Math.random() * 26) + 65)).join('');
const getRandomDigits = (length = 1) => Array(length).fill().map(e => Math.floor(Math.random() * 10)).join('');
const generateUniqueID = () => {
  let id = getRandomLetters(2) + getRandomDigits(4);
  while (existingIDs.includes(id)) id = getRandomLetters(2) + getRandomDigits(4);
  return id;
};
const newID = generateUniqueID();

console.log(newID);

【讨论】:

  • 完美运行。这是一个非常聪明的解决方案,因为我是新手,但它工作得很好:)。
【解决方案2】:

不知道你为什么想要这种模式,但你可以这样做:

const { floor, random } = Math;

function generateUpperCaseLetter() {
  return randomCharacterFromArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
}

function generateNumber() {
  return randomCharacterFromArray('1234567890');
}

function randomCharacterFromArray(array) {
  return array[floor(random() * array.length)];
}

const identifiers = [];

function generateIdentifier() {
  const identifier = [
    ...Array.from({ length: 2 }, generateUpperCaseLetter),
    ...Array.from({ length: 4 }, generateNumber)
  ].join('');

  // This will get slower as the identifiers array grows, and will eventually lead to an infinite loop
  return identifiers.includes(identifier) ? generateIdentifier() : identifiers.push(identifier), identifier;
}

const identifier = generateIdentifier();

console.log(identifier);

【讨论】:

  • 是的,这是一个很好的解决方案。可以创建重复项,但我认为我可以创建空数组,并且每次生成 ID 时检查是否存在这样的元素,如果不存在,则可以将其推送到数组。
【解决方案3】:

按照你的建议,他们很确定你会得到重复和冲突,我强烈建议使用 uuid。

也许你会发现这很有用:https://www.npmjs.com/package/short-uuid

或者,如果您想继续您的想法,这可能会有所帮助:Generate random string/characters in JavaScript

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多