钢铁直男兽

V1

2022/07/11阅读:12主题:极简黑

如何生成一个APP_ID

1. 什么是APP_ID

开放平台使用APP_ID, 来区分openapi的调用者, 相当于用户的一个身份证

用过开放平台的开发者 懂得都懂,不懂的说了也不懂,你也别问,利益牵扯太大,说了对你们没好处,我只能说水很深,网上的资料都删了,所以我只能说懂得都懂,不懂也没办法


2. 各家的APP_ID长什么样

● 微信的APP_ID

统一wx开头, "wx"+16位的 16进制数字

微信的APP_ID
微信的APP_ID

● 支付宝的APP_ID

16位的纯数字, 可以看出开头的4位是年份, 其他数字生成规则不明

支付宝的APP_ID
支付宝的APP_ID

● 融云的APP_ID

13位数字和字母组成的字符串, 生成规则不明

融云的APP_ID
融云的APP_ID

● 我设计的APP_ID

11位英文字母的组合

我设计的APP_ID
我设计的APP_ID

3. APP_ID需要满足什么需求

  1. APP_ID会频繁在开放平台的接口调用中被使用, 所以不能太长, 浪费带宽
  2. APP_ID可能被别人获取, 所以不能包含太多私有信息, 所以要有一定的随机性
  3. APP_ID很多情况下要方便客户以及开放平台的人员进行调试, 所以可以包含一定公开的信息; 什么样的信息是允许公开的需要开放平台的设计者斟酌, 如将集群信息暴露在APP_ID上,方便快速缩小检查范围
  4. APP_ID的长度要稳定, 不能一会儿长一会短显得不专业

4. 我的设计

下面介绍一下我是怎么设计APP_ID的

下面说一下我的app_id生成步骤

  1. 生成一个4位的十进制数字(1000~9999)
  2. 获取当前时间的时间戳, 13位十进制数字
  3. 组合成为一个 17 (4+13) 位的十进制数字
  4. 将这个17位的十进制数字转化为 36 进制数字(0~9,a~z; 一共36位)
/**
 * 先构造一个十进制的数字,
 * 前四位: 为随机值(1000,9999),
 * 后13位: 为时间戳 (类似于这种形式1631238326627)
 * 然后将该数字转换为字符串
 * 再用36进制重新解析([0-9]|[a-z]), 数字和小写字母
 * 得到的字符串长度为11个字节
 *
 * @return 生成的字符串用作app_id, 是个11个字节的字符串
 */

public static String generateAppId() {
    final String s = RandomUtil.randomInt(10009999) + String.valueOf(System.currentTimeMillis());
    BigInteger n = new BigInteger(s, 10);
    return n.toString(36);//转换成36进制, 得到的字符串长度11个字节
    //10000000000000000 转化之后是: 2qgpckvng1s ; 也是11个字节
    //99999999999999999 转化之后是: rcn1hssighr ; 也是11个字节
}

根据这个算法得到的APP_ID

  • 得到的字符串稳定11个字节 (utf8编码)
  • 生成的字符串有较强的随机性
  • 不包含任何私有信息

作为一个小厂的开发, 没有那么多需求, 只要生成的APP_ID有随机性,长度稳定, 长度不太长 就够用了

希望这篇辣鸡文章对你有帮助

- END -

分类:

后端

标签:

后端

作者介绍

钢铁直男兽
V1