一些例子包括:blazing-mist-4652,electric-night-4641,morning-frost-5543,radiant-river-7322等。
似乎它们都遵循形容词-名词-4位数字的模式(大部分情况下)。他们是否只是输入了一本形容词和名词组成的字典,并在您推送应用程序时从中随机选择组合?是否有一个Ruby gem可以做到这一点,并提供一个按语法类别搜索的字典,或者这是需要手动完成的事情?
我是 Heroku API 团队的工程师:我们采用了最简单的方法生成应用程序名称,即在内存中保留形容词和名词的数组,随机选择每个元素并与 1000 到 9999 的随机数字结合。
这可能不是我编写过的最激动人心的代码,但有趣的是看到我们必须为扩展做些什么:
起初,我们选择一个名称,尝试插入并通过救援唯一性约束错误选择不同的名称。当我们拥有大量名称池(和使用它们的应用程序集不太大)时,这很好运行,但在某种规模上,我们开始注意到在名称生成期间出现许多冲突。
为了使其更具弹性,我们决定选择几个名称,并使用单个查询检查哪些名称仍然可用。我们显然仍需要检查错误并重试,因为存在竞争条件,但是由于表中有如此多的应用程序,这显然更有效。
它还具有提供简单钩子的额外好处,因此我们可以获取警报,如果名称池较低(例如:如果取走 1/3 的随机名称,则发送警报)。
第一次遇到冲突问题时,我们仅通过将名称池的大小从 2 位数增加到 4 位数来根本性地增加了名称池的大小。使用 61 个形容词和 74 个名词,我们从 ~400k 增加到 ~40mi 名称(61 * 74 * 8999
)。
但是当我们运行了 200 万个应用程序时,我们开始再次收到冲突警报,并且高于预期的频率:约一半的名称会发生冲突,这在考虑到我们的池大小和运行的应用程序数量后没有任何意义。
罪魁祸首正如您可能已经猜到的那样是,rand
是一个相当糟糕的伪随机数生成器。改为使用 SecureRandom
来选择随机元素和数字根据我们的预期显著降低了冲突的数量。
在大量工作投入到扩展这个方法中之后,我们不得不思考是否有更好的方法来首先生成名称。一些讨论的想法包括:
将名称生成作为应用程序ID的函数。这样做会更快,完全避免了冲突问题,但缺点是会浪费很多被删除应用的名称(我们创建和删除很多应用程序,作为不同集成测试的一部分)。
另一个确定性生成名称的选项是在数据库中使用可用名称池。这将使诸如仅在应用程序删除后2周内重新使用名称等操作变得容易。
很期待下一次冲突警报触发时我们将做些什么!
希望这对任何正在开发友好名称生成的人有所帮助。
有几种可能性。
你可以生成随机字符串。
如果你想使用真实单词,你需要一个字典。然后你可以创建一个由单词和数字排列组合的结果。
另一个不错的选择是Ruote所采用的方法。Ruote依赖于rufus-mnemo为每个进程生成唯一的名称。rufus-mnemo
提供了将整数转换成更易记住的“单词”以及反之的方法。
你可以为记录生成一个唯一的ID,然后将其转换为单词。
感谢 @m1foley
我正在使用你的宝石 https://github.com/polleverywhere/random_username
生成随机名称:
num_size = 2 # you can change this value to change number size
temp_num = (Array.new(num_size) { rand(10).to_s }).join
app_url = RandomUsername.adjective + '-' + RandomUsername.noun + '-' + temp_num
解释:
一些生成的名称:
# caring-plateau-07
# teal-summer-32
# vivid-snowflake-25
# outrageous-summer-95