【问题标题】:Nodejs - Generating unique random alpha numeric random string for DatabaseNodejs - 为数据库生成唯一的随机字母数字随机字符串
【发布时间】:2016-09-15 18:13:28
【问题描述】:

我有一个用例,我需要生成长度为 25 的字母数字大写字符串,因此可能的唯一组合总数非常高:

36 pow (25) = 808281277464764060643139600456536293376

字符串将存储在MySql 数据库表中,unique 设置为true

我正在使用以下代码来生成字符串:

const Chance = require('chance');
const chance = new Chance(Date.now() + Math.random());
let randomStr = chance.string({length: 25, 
                pool: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'});
console.log(randomStr);

Node.js 可以在集群模式下运行,因此不同请求的时间戳值可以相同,所以我还添加了Math.random()。这是否足以确保MySql 唯一约束不会被随机字符串违反。

【问题讨论】:

  • 您想要一个普遍唯一且主要由字母数字组成的字符串?这听起来很像a UUID,您的数据库可能已经支持它。
  • @ssube uuid 是 128 位
  • 是的,UUID 是 128 位。这比您的 25 个字符的标识符要小得多,同时仍然是普遍唯一的并且在大多数数据库中进行了优化以实现快速查找。
  • @ssube 我没有提到我将使用它进行查找并希望提高查找性能
  • 性能与它无关。数据库是唯一能够保证一个值是唯一的参与者,所以它应该是产生这些值的那个。大多数数据库都有出色的 UUID 支持,其中恰好包括性能优化。

标签: javascript node.js encryption


【解决方案1】:

这是否足以确保随机字符串不会违反 MySQL 唯一约束。

3625 有 129 位。如果我们应用生日问题,那么您很可能会在 264 个字符串周围发生冲突。你可能会产生比这少得多的东西。仅当您使用良好的随机源时,这才是正确的。

Math.random() 不是一个好的随机源。

【讨论】:

  • 不附加时间戳和 math.random() 来生成种子保证至少每纳秒一个唯一的数字,如果我在集群中不使用超过 4 个节点服务器应该足够了
  • 不能保证,但不太可能。此外,您甚至可以在没有任何随机性的情况下解决这个问题。只需给集群中的每个节点一个不同的标识符(一个字符就足够了)。这不太可能,但是如果在单个节点服务器中同时处理两个请求,那么您可以使用计数器。连接节点 ID、计数器和时间戳以获得简短且有保证的唯一 ID。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 2010-09-08
  • 2011-02-17
  • 2011-08-23
  • 1970-01-01
  • 2012-11-21
  • 2010-10-18
相关资源
最近更新 更多