首先把题目贴出来(发到我手上的是图片,我用在线OCR工具抓出来的):
1.游戏玩家的初始用户名是随机的,遵从以下格式:两个大写字母后面跟着四个数字,比如|RX8372|或者|BC8115|。應机意味着,用户名不能符合某个可以预测的序列。此外,随机用户名意味着存在冲突风险,如有可能,解决方案中应避免重复使用用户名。请按以上要求编写代码。
2.请为以上程序编写测试代码。
3.请估算程序生成10,000个用户名所需要的时间,并给出分析过程。
4.如需在多个进程中,独立生成符合以上规则的、不重复的随机用户名,应该如何调整算法。
5.请使用github.com提交上述答案,回复git repository地址即可。
对于问题1,工程中的lib/index.js中包含了对这个问题的实现。但是这个实现只是针对这个题目来写的一个事例,而且是按照单点来设计的,实际项目中肯定是不能这么写的。同时,这个题目本身描述的需求和设计在实际项目中也是不合理而且有严重风险的。就算实现出来,跑不了多久就会出问题。
对于问题2,工程中的test/run.js中包含了对这个问题的实现。因为时间不多,我就不去折腾单元测试之类的插件了。
对于问题3,如果不考虑到随机出重复的值之后的处理,整个随机生成的过程的时间复杂度是O(1)的,所以说有限的几次测试得到的性能数据就足以说明问题。我在自己的开发机(i5-4460)上执行一百万次生成昵称的操作,需要1.3秒左右,那1万次就是13毫秒左右。至于随机出重复的值的情况,至少对于一百万次这个级别的执行次数,发生的概率是很小的,在这里可以忽略这个因素对执行时间的影响。
对于问题4,我想说服务器端开发应该从一开始就考虑到自己的逻辑会在很多个进程,很多台机器上执行,也就是说从一开始就不应该按照单点来设计。这个时候最保险的方法是依赖类似MySql的自增主键的东西如果你硬要自己写,那可能需要写一个类似zookeeper的东西来保证多台服务器上的数据保持一致,同时具有分布式的容灾特性。zookeeper的资料在这里http://zookeeper.apache.org/
对于问题5,你看见这些内容了就说明问题5已经满足了。
至于这个题目和实际项目相比有多少不合理的地方,我就不详细写了,需要的话可以单独聊。