【问题标题】:Check if there are any unique tokens left of a certain character length检查是否有特定字符长度的唯一标记
【发布时间】:2016-06-15 11:23:34
【问题描述】:

我有一个属性为 token 的 Post 模型。

我正在使用SecureRandom.urlsafe_base64(length_of_token) 创建令牌。

令牌不需要不可猜测,但必须是唯一的。

我从 1 个字符长的标记开始,当它们全部用完(所有 64 种组合)时,我应该继续使用 2 个字符长的标记。

我应该如何检查 3 个字符长的标记是否有任何标记变体?

【问题讨论】:

  • 方法参数指定字节数。因此,urlsafe_base64(1) 生成 256 个值,urlsafe_base64(2) 生成 65,536 个值,依此类推 (256^n)。此外,假设已经创建了 65,535 个“长度”为 2 的标记(只剩下一个),你如何生成最后一个?

标签: ruby-on-rails ruby ruby-on-rails-5 ruby-2.3


【解决方案1】:

应该是这样的:

64**n - Post.count(:token).where('char_length(token) = ?', n)

第一部分给出可能的组合数,第二部分给出记号长度为 n 的记录数。

但不要忘记,您的随机生成器不一定会生成剩余的可能组合。随着时间的推移,冲突将呈指数级增长,因此我强烈反对这种实现方式。

注意:char_length 语句是 MySQL 特定的,因此根据您的 RDBMS,您必须调整这部分。

【讨论】:

  • 请注意64 ^ n 不等同于64 ** n
  • 谢谢 Stefan,我改了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多