如何生成类似于 “aX4j9Z” 的短 UID (在 JS 中)

113

为了我的 JavaScript 网站应用程序,我想生成短的 GUID(用于不同类型的对象 - 字符串和字符串数组)

我希望我的 UID(GUID)类似于 "aX4j9Z"。

所以这些 UID 应该足够轻量级,以便进行 Web 传输和 JS 字符串处理,并且对于结构不是非常庞大的情况下(不超过10k个元素),具有相当的唯一性。我的意思是,在生成 UID 后,我可以检查此 UID 是否已存在于结构中,并在需要时重新生成它。


2
什么是“uid”和“guid”?生成唯一值的最简单方法是从类似于“x”的字符串开始,然后附加由计数器生成的数字,这样您就可以得到“x0”,“x1”等。 “unique”在什么上下文中使用?元素ID和名称?某个对象的属性?还是其他? - RobG
1
只需放置一个有关此主题的GISTS搜索链接:https://gist.github.com/search?l=JavaScript&q=unique+id - vsync
13个回答

1

随机生成一些字符串:

function getUID(len){
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
          out = '';

    for(var i=0, clen=chars.length; i<len; i++){
       out += chars.substr(0|Math.random() * clen, 1);
    }

    // ensure that the uid is unique for this page
    return getUID.uids[out] ? getUID(len) : (getUID.uids[out] = out);
}
getUID.uids = {};

2
似乎生成随机字符串然后测试其是否唯一是低效的。使用简单计数器即可生成唯一字符串(其中唯一具有某些范围或上下文),无论是否使用随机生成的组件都很简单。 - RobG
@RobG - 如果您正在生成6位数字密钥(有568亿个唯一密钥),那么其中一个密钥不唯一的概率非常低。几乎永远不会发生冲突,因此几乎永远不需要重新生成密钥。 - user578895
1
@cwolves - 为什么要留下任何机会,当可以简单地避免呢?而且为什么要生成一个必须检查唯一性的值,当你可以在第一时间生成一个保证独特的值呢? - RobG
@RobG - 因为 OP 可能不想要 "000","001",... "00z","00A",...,随机生成这些是简单的方法。即使您对它们进行哈希,仍然需要基本的哈希冲突检测。此外,这些可能在页面加载之间使用,等等,在这种情况下,您并不总是想从 1 开始。我的一般论点是,如果 OP 只想要页面的 guid,那么一个简单的计数器就可以了。由于 OP 没有要求计数器,因此提供基于 62 的计数器也没有太大用处。 - user578895
OP可以生成所需数量的ID并随机分配它们,以便它们不是连续的(虽然问题中没有指定,但可能需要这样做)。 - RobG
@RobG - 那比重新生成密钥的1/5.6百万几率好多了,对吧?:) 我仍然认为,如果OP想要'guids',生成顺序密钥不是一个好的解决方案。但无论如何,这是OP的问题 :) - user578895

0
我在我的数据库中使用这个TypeScript函数来创建比UUID更易读的唯一标识符。请注意,在插入记录时,我会捕获重复键异常,并使用新的ID进行重试。
const idChars: string = 'ABCDEFGHJKMNPQRSTUVWXYZ'

export function generateId(): string {
  const now: Date = new Date()
  let id = now.getUTCFullYear().toString()
  id += now.getUTCMonth().toString().padStart(2, '0')
  id += now.getUTCDay().toString().padStart(2, '0')
  for (let i = 0; i < 6; i++) id += idChars[Math.floor(Math.random() * idChars.length)]
  return id
}

它生成像20230506VJDMQD这样的ID。

日期前缀在确保唯一性方面非常有帮助,特别是在长时间内创建数千条数据库记录时。对于客户编号或发票编号等事项,日期部分提供了额外的信息,而不仅仅是唯一性。

您可以很容易地根据自己喜好调整字符集,并且如果您不想要日期前缀,也可以轻松从代码中删除该部分。

如果您每天需要生成数百万个ID,那么您可以将循环次数从6增加到更大的数字,但在某个点上,您可能会选择使用UUID。

如果您真的只想要6个字符,那么JavaScript中的简化版本如下:

const idChars = 'ABCDEFGHJKMNPQRSTUVWXYZ'

function generateId() {
  let id = ''
  for (let i = 0; i < 6; i++) id += idChars[Math.floor(Math.random() * idChars.length)]
  return id
}


0

您可以使用md5算法生成随机字符串。md5是Node.js的一个包。

 var randomChars = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);
 var shortUrl = md5(originalUrl + randomChars + new Date()).substring(0, 5).toString();
 console.log(shortUrl);

这将每次生成唯一的字符串。


@vsync 这是正确的解决方案吗?使用 Node 的 md5 包。 - Prathamesh More

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接