生成唯一的ID js

Zac*_*cky 2 javascript arrays jasmine

在Jasmine中运行一些测试以尝试使此代码正常工作,发现id不是唯一的。这是有道理的,因为它们是像这样随机生成的。

var Robot = function(){
    this.name = makeid();
    function makeid()
    {
        var text = "";
        var possible ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        for( var i=0; i < 2; i++ ){
            text += possible.charAt(Math.floor(Math.random() * possible.length));
        }
        var possibleNums ="0123456789";
        for( var j=0; j < 3; j++ ){
            text += possibleNums.charAt(Math.floor(Math.random() * possibleNums.length));
        }
        return text;
    }
};
Run Code Online (Sandbox Code Playgroud)

我需要它来完成这个测试。

it('there can be lots of robots with different names each', function() {
    var i,
        numRobots = 10000,
        usedNames = {};

    for (i = 0; i < numRobots; i++) {
      var newRobot = new Robot();
      usedNames[newRobot.name] = true;
    }
    expect(Object.keys(usedNames).length).toEqual(numRobots);
  });
Run Code Online (Sandbox Code Playgroud)

我认为我可以制作一个数组,将每个名称推入其中,然后比较唯一性。看起来可能令人沮丧。我想知道是否还有另一种方法,也许可以保证生成时的唯一性或一些不涉及数组的简单比较工具。

编辑:日期戳方法将是确保唯一ID的一种很好的方法,但是不幸的是,我必须使用用于通过另一项测试的ID生成方法。本质上,我需要ID为5个字符,并带有2个大写字母,后跟3个数字。

Luk*_*non 7

您可以使用Date.now(),而不是使用自定义的唯一ID生成系统,它会以毫秒为单位返回日期和时间,如下所示:1463004819469

Date.now()每毫秒变化一次,并且始终不变化。假设您的程序没有多个线程,则必须按顺序进行操作,因此不会有两个ID相同。

例如:

var Robot = function(){
    this.name = Date.now(); //1463004819469
}
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题!


编辑:如果您new Robot()连续两次拨打电话,您很可能会获得相同的ID。您可以使用串联Date.now()的自定义唯一ID或随机数,例如以下一种:

  • this.name = String(Date.now())+Math.floor(Math.random()*10000);
  • this.name = String(Date.now())+makeid();
  • this.name = String(Date.now())+String(counter); //increment this every time you create a Robot

这些只是示例,您可以创建所需的任何组合。

老实说,您为什么不只使用柜台?像这样:

var counter = 0;
var Robot = function(){
    counter++;
    this.name = counter;
}
Run Code Online (Sandbox Code Playgroud)

除非这些ID也不存在于程序外部,否则在这种情况下将不起作用。

  • 当然,多次调用`Date.now()`可以生成相同的值。证明在这里:https://jsfiddle.net/jfriend00/rgLgd8qn/。请从答案的第一部分中删除该声明。 (2认同)