微信小程序使用openid生成唯一数字ID(哈希算法)

这篇具有很好参考价值的文章主要介绍了微信小程序使用openid生成唯一数字ID(哈希算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 引入 crypto-js 库和云函数所需的模块。
  2. const CryptoJS = require('./crypto-js');
    // 云函数入口文件
    const cloud = require('wx-server-sdk')
    cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
    const db = cloud.database();
  3. 定义了一个 convertToUniqueDigits 函数,接收两个参数:需要转换的字符串和返回的结果的数字位数。

        在函数内部,使用 sha256 函数将字符串转换为哈希值,然后将哈希值转换为数字,并将结果映射到指定的位数。

        如果结果中有重复的数字,增加一个偏移量,直到结果中没有重复的数字。        

        使用云数据库查询当前是否有这个 id,如果有,则重新调用该函数并增加转化结果的位数,直到得到一个不存在的 id。这里可以省略,只要保证传进来的字符串具有唯一性,则转化的结果也具有唯一性。

        如果不存在这个 id,直接返回结果。

  1. /**
     * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性)
     * 
     * @param {String} s 需要转换的字符串
     * @param {Number} n 返回的结果的数字位数
     */
    async function convertToUniqueDigits(s, n) {
      // 使用哈希算法将字符串转换为数字
      const m = sha256(s);
      // 将哈希值转换为数字,并将结果映射到指定的位数
      let x = parseInt(m, 16) % (10**n);
      // 如果结果中有重复的数字,增加一个偏移量
      while (hasDuplicateDigits(x)) {
        x = (x + 1) % (10**n);
      }
      //检查数据库是否存在这个id
      const hasUID = await checkHasUid(x);
      //存在这个id,则重新调用该函数并增加转化结果的位数
      if(hasUID>0){
        return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环
      }
      //不存在这个ID,直接返回结果
      else{
        return x;
      }
    }
  2. 检查是否存在相同的uid
  3. async function checkHasUid(uid){
      const res = await db.collection('user_list').where({
        uid: String(uid)
      }).count();
    
      return res.total
    }
  4. 引用哈希算法
  5. function sha256(s) {
      // 使用 SHA-256 哈希算法将字符串转换为哈希值
      const hash = CryptoJS.SHA256(s);
      return hash.toString(CryptoJS.enc.Hex);
    }
  6. 检查数字中是否有重复的数字
  7. function hasDuplicateDigits(x) {
      // 检查数字中是否有重复的数字
      const digits = String(x).split('');
      return digits.length !== new Set(digits).size;
    }
  8. 最后,将 convertToUniqueDigits 函数导出供其他模块使用。
  9. module.exports = {
      convertToUniqueDigits: convertToUniqueDigits
    };
  10. 完整的代码
  11. const CryptoJS = require('./crypto-js');
    // 云函数入口文件
    const cloud = require('wx-server-sdk')
    cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
    const db = cloud.database();
     
    /**
     * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性)
     * 
     * @param {String} s 需要转换的字符串
     * @param {Number} n 返回的结果的数字位数
     */
    async function convertToUniqueDigits(s, n) {
      // 使用哈希算法将字符串转换为数字
      const m = sha256(s);
      // 将哈希值转换为数字,并将结果映射到指定的位数
      let x = parseInt(m, 16) % (10**n);
      // 如果结果中有重复的数字,增加一个偏移量
      while (hasDuplicateDigits(x)) {
        x = (x + 1) % (10**n);
      }
      //检查数据库是否存在这个id
      const hasUID = await checkHasUid(x);
      //存在这个id,则重新调用该函数并增加转化结果的位数
      if(hasUID>0){
        return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环
      }
      //不存在这个ID,直接返回结果
      else{
        return x;
      }
    }
    
    //检查是否存在相同的uid
    async function checkHasUid(uid){
      const res = await db.collection('user_list').where({
        uid: String(uid)
      }).count();
    
      return res.total
    }
     
    function sha256(s) {
      // 使用 SHA-256 哈希算法将字符串转换为哈希值
      const hash = CryptoJS.SHA256(s);
      return hash.toString(CryptoJS.enc.Hex);
    }
     
    function hasDuplicateDigits(x) {
      // 检查数字中是否有重复的数字
      const digits = String(x).split('');
      return digits.length !== new Set(digits).size;
    }
    module.exports = {
      convertToUniqueDigits: convertToUniqueDigits
    };
    

    调用示例:

  12. const uniID = require('./uniqueID/unique-digits');
    const s = event.openid; //用户openid
    const n = 7; //生成的ID位数
    const uid = await uniID.convertToUniqueDigits(s, n);
    
    console.log(await uniID.convertToUniqueDigits('o8k0G44JT0OBw48J6yu4O6ueF978', 7));
    //输出结果:9623014

    哈希算法代码:

  13. 将下面的哈希代码复制到同一云函数下的js文件中,导入即可

  14. 哈希算法链接https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js文章来源地址https://www.toymoban.com/news/detail-596744.html

到了这里,关于微信小程序使用openid生成唯一数字ID(哈希算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue中使用uuid生成唯一ID(脚手架创建自带的)

    说明:一般封装工具函数。 说明: 本人使用的是detail组件中的仓库。

    2024年02月13日
    浏览(44)
  • gin-vue-admin二开使用雪花算法生成唯一标识 id

    需求场景: 总部采集分支的数据,由于分支的 id 是子增的主键 id,所以会出现重复的 id,但是这个 id 需要作为标识,没有实际作用,这里选择的是分布式 id 雪花算法生成 id 存储用来标识,这个项目基于 gva 进行开发的,可以使用 sonyflake 和 snowflake 两个实现方式都可以解决

    2024年01月17日
    浏览(37)
  • 微信小程序获取openid,微信小程序获取手机号

    工具类

    2024年02月16日
    浏览(56)
  • 微信小程序获取openId

    在微信小程序中,我们无法直接从客户端获取用户的openid,因为openid是保存在微信服务器上的。但是,我们可以通过微信提供的登录接口,使用用户授权登录的方式获取用户的openid。 具体步骤如下: 1. 在小程序中引入`wx.login`方法,调用该方法会返回一个`code`,这个`code`用于

    2024年02月15日
    浏览(51)
  • 微信小程序获取openid流程

    调用wx.login(OBJECT) 获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。 返回数据信息: { errMsg: 调用结果 code: 用户登录凭证(有效期五分钟)。开发者需要在开发

    2024年02月14日
    浏览(46)
  • uniapp微信小程序获得openid

    可以自动获取或点击按钮获取 获取openid 注意:一般都是将code值传到后端去获取openid,因为在前端可能会被抓包或爬取到你的appid和secret,不安全,如果放在后端获取openid,除非你的服务器被攻击了,不然就是安全的。下面的实例是在前端直接获取的,这个明白后,可以直接

    2024年02月06日
    浏览(48)
  • 抓包微信小程序openid的教程

    windows 电脑 1、下载安装Charles,官网版有30天试用。地址:https://www.charlesproxy.com/download/ 或者自行找方法安装该软件即可。 2、打开Charles软件,同时打开微信电脑版并登录。 3、设置 Charles 开启https抓包。点击Proxy - SSL Proxying Settings 在弹出的窗口中,在左侧的 include 中添加 * :

    2024年02月10日
    浏览(60)
  • 微信小程序----API、获取openid、消息订阅

    https://www.w3xue.com/mobile/wxminiapp/hpm41q8p.html 基础: API,全称Application Programming Interface,即应用程序编程接口。 API 是一些预先定义函数,目的是用来提供应用程序与开发人员基于某软件或者某硬件得以访问一组例程的能力,并且无需访问源码或无需理解内部工作机制细节。 API

    2024年02月09日
    浏览(48)
  • 【微信小程序】通过云函数获取用户openid

    1.pages同级目录下新建新文件夹,命名为cloudFunctions(其他名字也可以)。 2.project.config.json中添加以下内容,值为上一步创建的文件夹名字。编译一次后上一步创建的文件夹前图标就带“云”了。 3.app.js内的App中添加 1.右击cloudFunctions文件夹,点击【新建Node.js云函数】,命名为

    2024年02月10日
    浏览(62)
  • uniapp写微信小程序,获取openId、unionId

    appId,secret   可以从微信公众平台获取,(点击右上角头像,向下滑,可以找到) 注意:这个一般写了app.vue里有个onlanch函数,否则有可能在进入小程序时获取不到openid 微信接口路径为 “https://api.weixin.qq.com/sns/jscode2session” 获取unionId的前提条件:微信开放平台绑定你的小程

    2024年02月13日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包