美文网首页
生成唯一的用户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

    用户ID作为一个用户的唯一标识,在生成的时候需要保证是唯一的。想了想,如果把时间戳的毫秒算上,那么基本上用户ID重...

  • 生成全局唯一id的几种方式

    生成全局唯一id的几种方式: 1、uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高;缺点...

  • 生成唯一id

    1.API >=9:通过“Build.SERIAL”这个属性来保证ID的独一无二。 api<9

  • nsq源码(7) nsqd messageID

    messageID 消息唯一标识 GenerateID()返回ID NewGUID()生成ID

  • 生成分布式序列ID

    生成分布式序列ID 介绍 在很多分布式系统中,需要生成唯一的id。如在分库分表的情况下,给某个逻辑表生成唯一id。...

  • 随手小工具函数

    js 随机生成唯一值(ID)

  • js如何生成唯一标识符(类似uuid)

    1. JavaScript唯一ID生成器Nano ID NanoID: 一个极小的,安全的ID生成器Source:...

  • 设计分布式唯一id生成

    1. 生成全局唯一id 什么时候需要生成全局唯一id db不帮你自动生成的时候。比如: db做了分库分表,没帮你自...

  • Redis-全局唯一ID

    零、本文纲要 一、全局唯一ID 二、Redis生成全局唯一ID1、snowflake算法全局唯一ID策略2、Red...

  • 全局唯一ID

    生成全局唯一ID 通过MySQL的自增主键,作为唯一id; 通过内存中变量AtomicLong的自增来得到唯一id...

网友评论

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

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