美文网首页
生成唯一的用户ID

生成唯一的用户ID

作者: CRJ997 | 来源:发表于2020-03-23 18:07 被阅读0次

    用户ID作为一个用户的唯一标识,在生成的时候需要保证是唯一的。想了想,如果把时间戳的毫秒算上,那么基本上用户ID重复的概率会挺小的。所以用时间戳来作为ID我觉得还是可行的。
    不过...1584956506806这玩意好难看。

    改进

    因为如果直接用时间戳来作为用户ID的话,真心难看,所以自己做一个映射,来把对应的数字换成自己想要的样子。

    const sequenceStr  = '01234567890abcdefghijklm$nopqrst'; // 随便定义一个字符串
    const sequenceArr = sequenceStr.split(''); // 这样我们就可以得到一个可以作为映射的数组了
    

    当然,上面的字符串顺序还是随便打乱好一些,而且最好数目长一些,毕竟一分钟可是有60秒的,所以最好长一些。我选的是大于60个。

    选择字符和进行映射

    字符自己喜欢吧。
    我自己挑了62个字符(不重复)。然后我要生成13位的用户ID。所以进行了简单的映射。

    // 语言环境 ts
    function generateUserId () {
      const now = new Date(); // 这里获取一个Date对象。
      // 然后获取年份,月份,日期,小时,分钟,秒,毫秒。
      // 年份4位,月份1位, 日期1位, 小时1位,分钟1位,秒1位,毫秒3位,再随机一位
      const year = now.getFullYear();
      const yearArr: number[] = String(year).split('').map(item => Number(item));
      const month = now.getMonth() + 1;
      const date = now.getDate();
      const hour = now.getHours();
      const minutes = now.getMinutes();
      const seconds = now.getSeconds();
      const miliSeconds = now.getMilliseconds();
      const millisecondsArr = String(miliSeconds).split('').map(item => Number(item));
      const result = `${sequenceArr[yearArr[0]]}${sequenceArr[yearArr[1]]}${sequenceArr[yearArr[2]]}${sequenceArr[yearArr[3]]}${sequenceArr[month]}${sequenceArr[date]}${sequenceArr[hour]}${sequenceArr[minutes]}${sequenceArr[seconds]}${sequenceArr[Math.floor(millisecondsArr[0])]}${sequenceArr[Math.floor(millisecondsArr[1])]}${sequenceArr[Math.f loor(millisecondsArr[2])]}`;
      return result + `${sequenceArr[Math.floor(Math.random() * 62)]}`;
    }
    

    然后就搞定了。

    结语

    这是自己的思路,可能有纰漏。
    另外多说一些:

    1. 如果怕别人根据你的规律去破解的话,可以尝试用sha256, md5等不可逆算法去生成一个摘要, 不过要保证你的数据库存得下, 因为很多时候用户名这种东西都是定长存在数据库的。
    2. 如果你是构建一个大的系统,那么你要保证自己用户名的数量是足够用的。我这边是62^13次方,结果是200028539268669788905472个,应该还算不错,不过实际上没用这么多,因为年份4位顶多9,达不到62,但是根据时间戳的映射来讲,应该可以保证唯一。
    3. 高并发下这种方式应该不适用,可用于个人的小项目。

    相关文章

      网友评论

          本文标题:生成唯一的用户ID

          本文链接:https://www.haomeiwen.com/subject/rbawyhtx.html