如何在JavaScript中生成唯一标识符?

3

我想记录网站上的流量。在每次点击时,我想生成一个唯一的ID,并将其存储在数据库中。 为了生成唯一的ID,我编写了下面的代码,但有时会在数据库中得到相同的条目。

 timingVar = 'load_'+Date.now()+'_'+uniqueid();

//function used to generate unique number//
function uniqueid() {
    var ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var ID_LENGTH = 8;
    var rtn = '';
    for (var i = 0; i < ID_LENGTH; i++) {
      rtn += ALPHABET.charAt(Math.floor(Math.random() * ALPHABET.length));
    }
    return rtn;
}

1
如果您在服务器上生成这些ID,那么这将更加合适。为每个用户设置一个会话,如果该用户第二次访问,则记录下来。 - Relm
我必须使用 JavaScript 来生成唯一的 ID,我的代码有什么问题?我的代码可能会产生重复的 ID 吗? - Praveen D
你的代码问题很简单,就是它没有防止重复,而且随机字段远远不够大。这就是为什么我们需要健壮的UUID算法。36^8远远不能期望从中选择的随机数是唯一的,特别是在使用浏览器中不完美的伪随机数生成器时更是如此。 - T.J. Crowder
@PraveenD 如果没有更多信息,那么它很可能不是您的唯一ID代码,而是您如何使用它。您在ID中使用了Date.now,因此需要在完全相同的时间进行两个请求并获得相同的随机数?这是不太可能的(但有可能,这就是为什么您应该查看TJCrowder的链接)。然而,即使您拥有真正唯一的ID,您仍然会在数据库中获得重复项。也就是说,这是另一个XY问题吗?您是否还记录IP地址?重复项来自同一IP吗?最重要的是,您的timingVar是全局的吗?(如问题所述)。 - freedomn-m
基本上,我的意思是在你发送timingVar之前,你很可能会覆盖它,因此第一次调用会得到第二次调用的值,从而导致重复。这可能是由于全局变量或对闭包的误解引起的。如果没有你所有的代码,就无法确定。 - freedomn-m
因此,我认为这不是链接中的重复。 - freedomn-m
1个回答

0

数据库可以配置使用自动生成的唯一值(大多是连续的数字)用于列。您不应该依赖客户端上的JavaScript来完成此操作。


我想要在JavaScript中生成唯一标识符。我的代码有什么问题? - Praveen D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接