当前位置:   article > 正文

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

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

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

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

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

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

    1. /**
    2. * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性)
    3. *
    4. * @param {String} s 需要转换的字符串
    5. * @param {Number} n 返回的结果的数字位数
    6. */
    7. async function convertToUniqueDigits(s, n) {
    8. // 使用哈希算法将字符串转换为数字
    9. const m = sha256(s);
    10. // 将哈希值转换为数字,并将结果映射到指定的位数
    11. let x = parseInt(m, 16) % (10**n);
    12. // 如果结果中有重复的数字,增加一个偏移量
    13. while (hasDuplicateDigits(x)) {
    14. x = (x + 1) % (10**n);
    15. }
    16. //检查数据库是否存在这个id
    17. const hasUID = await checkHasUid(x);
    18. //存在这个id,则重新调用该函数并增加转化结果的位数
    19. if(hasUID>0){
    20. return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环
    21. }
    22. //不存在这个ID,直接返回结果
    23. else{
    24. return x;
    25. }
    26. }

  1. 检查是否存在相同的uid
    1. async function checkHasUid(uid){
    2. const res = await db.collection('user_list').where({
    3. uid: String(uid)
    4. }).count();
    5. return res.total
    6. }

  2. 引用哈希算法
    1. function sha256(s) {
    2. // 使用 SHA-256 哈希算法将字符串转换为哈希值
    3. const hash = CryptoJS.SHA256(s);
    4. return hash.toString(CryptoJS.enc.Hex);
    5. }
  3. 检查数字中是否有重复的数字
    1. function hasDuplicateDigits(x) {
    2. // 检查数字中是否有重复的数字
    3. const digits = String(x).split('');
    4. return digits.length !== new Set(digits).size;
    5. }
  4. 最后,将 convertToUniqueDigits 函数导出供其他模块使用。
    1. module.exports = {
    2. convertToUniqueDigits: convertToUniqueDigits
    3. };

  5. 完整的代码
    1. const CryptoJS = require('./crypto-js');
    2. // 云函数入口文件
    3. const cloud = require('wx-server-sdk')
    4. cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
    5. const db = cloud.database();
    6. /**
    7. * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性)
    8. *
    9. * @param {String} s 需要转换的字符串
    10. * @param {Number} n 返回的结果的数字位数
    11. */
    12. async function convertToUniqueDigits(s, n) {
    13. // 使用哈希算法将字符串转换为数字
    14. const m = sha256(s);
    15. // 将哈希值转换为数字,并将结果映射到指定的位数
    16. let x = parseInt(m, 16) % (10**n);
    17. // 如果结果中有重复的数字,增加一个偏移量
    18. while (hasDuplicateDigits(x)) {
    19. x = (x + 1) % (10**n);
    20. }
    21. //检查数据库是否存在这个id
    22. const hasUID = await checkHasUid(x);
    23. //存在这个id,则重新调用该函数并增加转化结果的位数
    24. if(hasUID>0){
    25. return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环
    26. }
    27. //不存在这个ID,直接返回结果
    28. else{
    29. return x;
    30. }
    31. }
    32. //检查是否存在相同的uid
    33. async function checkHasUid(uid){
    34. const res = await db.collection('user_list').where({
    35. uid: String(uid)
    36. }).count();
    37. return res.total
    38. }
    39. function sha256(s) {
    40. // 使用 SHA-256 哈希算法将字符串转换为哈希值
    41. const hash = CryptoJS.SHA256(s);
    42. return hash.toString(CryptoJS.enc.Hex);
    43. }
    44. function hasDuplicateDigits(x) {
    45. // 检查数字中是否有重复的数字
    46. const digits = String(x).split('');
    47. return digits.length !== new Set(digits).size;
    48. }
    49. module.exports = {
    50. convertToUniqueDigits: convertToUniqueDigits
    51. };

    调用示例:

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

    哈希算法代码:

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

  7. 哈希算法链接https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/623673
推荐阅读
相关标签
  

闽ICP备14008679号