用户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)]}`;
}
然后就搞定了。
结语
这是自己的思路,可能有纰漏。
另外多说一些:
- 如果怕别人根据你的规律去破解的话,可以尝试用sha256, md5等不可逆算法去生成一个摘要, 不过要保证你的数据库存得下, 因为很多时候用户名这种东西都是定长存在数据库的。
- 如果你是构建一个大的系统,那么你要保证自己用户名的数量是足够用的。我这边是62^13次方,结果是200028539268669788905472个,应该还算不错,不过实际上没用这么多,因为年份4位顶多9,达不到62,但是根据时间戳的映射来讲,应该可以保证唯一。
- 高并发下这种方式应该不适用,可用于个人的小项目。
网友评论