高端定制网站开发设计建站流程登封市城乡建设路网站

news/2025/9/22 16:23:15/文章来源:
高端定制网站开发设计建站流程,登封市城乡建设路网站,请网络推广外包公司有用吗,做网站建设的前景1 简介 1.1 横向联邦学习 横向联邦学习也称为按样本划分的联邦学习#xff0c;主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景#xff0c;例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体#xff0c;所以他们的客户交集非常小主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体所以他们的客户交集非常小并且数据集有不同的样本ID然而他们的业务模型却非常相似因此他们的数据集的特征空间是相同的。由此这两家银行就可以联合起来进行横向联邦学习以构建更好的风控模型。 1.2 相关工作 谷歌联邦学习研发团队在ACM CCS 2017学术大会上提出的一种高效的安全聚合方法利用秘密共享技术使服务器能够安全地聚合来自不同用户的梯度同时单个用户的梯度不会被泄露。 Practical secure aggregation for privacy-preserving machine learning 源代码见https://github.com/ammartahir24/SecureAggregation 2 Practical secure aggregation for privacy-preserving machine learning分析 2.1 论文的动机 机器学习模型通常会包含大量的神经网络参数而在联邦学习的场景中用户在本地训练好模型后需要将这些参数上传至服务器进行聚合但直接上传是存在隐私泄露的风险的因此需要将所有参数进行加密再进行聚合。 我们知道加密解密的运算时间是不容忽视的特别是在训练深度学习神经网络时模型参数可能达到上千个甚至上万个对这些模型参数加密并满足同态的性质是一个极具挑战的任务。 2.2 贡献 1支持高维向量的加密2即使每一轮有新的用户加入该方案也能保持高效的通信3能够应付用户掉线的情况4在以服务器为中介的、未经身份验证的网络模型的约束下提供最强的安全性。 2.3 预备知识 将涉及到秘密共享、密钥协商、认证加密、伪随机数生成、数字签名、公钥基础设施等知识。 2.3.1 Key Agreement 密钥协商 核心为Diffie-Hellman密钥交换两个用户可以协商一个共享密钥 KA.param⁡(k)\operatorname{KA.param} (k)KA.param(k)生成一些公共参数 ppp ppp。KA.gen⁡(pp)\operatorname{KA.gen} (p p)KA.gen(pp) 参与方 uuu 根据 ppp ppp 生成私-公密钥对 (suSK,suPK)\left(s_{u}^{S K}, s_{u}^{P K}\right)(suSK​,suPK​)。KA.agree⁡(suSK,svPK)\operatorname{KA.agree} \left(s_{u}^{S K}, s_{v}^{P K}\right)KA.agree(suSK​,svPK​)用户使用自身的私钥 suSKs_{u}^{S K}suSK​ 和所有其他用户 vvv 的公钥 svPKs_{v}^{P K}svPK​ 生成 uuu 和 vvv 之间的私有共享密钥 su,vs_{u, v}su,v​ 。 在DH密钥协商中使用了哈希函数的密钥协商方案。 2.3.2 Secret Sharing 秘密共享 核心为shamir的(t,n)(t, n)(t,n)秘密分享方案将要分享的秘密参数sss通过多项式分成nnn份只有满足至少ttt份份额才可解密得到sss SS.share⁡(s,t,U)\operatorname{SS.share} (s, t, \mathcal{U})SS.share(s,t,U)共享算法输入为秘密 sss 代表用户ID的 nnn 个域元素的集合 U\mathcal{U}U 和一个阈值 t≤∣U∣t \leq|\mathcal{U}|t≤∣U∣ 输出为共享 sus_{u}su​ 的集合其中 u∈Uu \in \mathcal{U}u∈U。SS.recon⁡({(u,su)}u∈V,t)\operatorname{SS.recon}\left(\left\{\left(u, s_{u}\right)\right\}_{u \in \mathcal{V}}, t\right)SS.recon({(u,su​)}u∈V​,t)重构函数输入为阈值 ttt 参与共享的用户子集 V⊆U\mathcal{V} \subseteq \mathcal{U}V⊆U 且满足 ∣V∣≥t|\mathcal{V}| \geq t∣V∣≥t 输出为域元素 sss。 2.3.3 加密、哈希、签名 PRG可以理解为Hash加密和签名为密码学基本工具。 加密 – AE.enc⁡\operatorname{AE.enc}AE.enc认证加密的加密算法输入为密钥key和消息message输出为密文ciphertext。 – AE.dec⁡\operatorname{AE.dec}AE.dec认证加密的解密算法输入为密文ciphertext和密钥key输出为原始明文或者是错误一个符号。哈希 – PRG⁡(b)\operatorname{P R G}(b)PRG(b)以 bbb 为随机种子的伪随机数生成算法。签名机制 – SIG.gen⁡(k)\operatorname{SIG.gen} (k)SIG.gen(k)以安全参数 kkk 作为输入输出为一个私钥 dSKd^{S K}dSK 和一个公钥 dPKd^{P K}dPK 。 – SIG.sign⁡(dSK,m)\operatorname{SIG.sign} \left(d^{S K}, m\right)SIG.sign(dSK,m)以私钥 dSKd^{S K}dSK 和消息 mmm 作为输入输出为签名 σ\sigmaσ 。 – SIG.ver⁡(dPK,m,σ)\operatorname{SIG.ver} \left(d^{P K}, m, \sigma\right)SIG.ver(dPK,m,σ) 输入为公钥 dPKd^{P K}dPK 消息 mmm 和签名 σ\sigmaσ 验证签名的合法性。 2.4 协议构造 该方案假设用户id有序且以下算法是以单次聚合的角度进行讨论但我们知道机器学习需要多次聚合才能收敛到阈值因此以下讨论的步骤需要在每一次聚合时执行。 2.4.1 加密构思 加密的设计方案如下所示 yuxu∑v∈U:uvsu,v−∑v∈U:uvsv,u(modR)\boldsymbol{y}_{u}\boldsymbol{x}_{u}\sum_{v \in \mathcal{U}: uv} \boldsymbol{s}_{u, v}-\sum_{v \in \mathcal{U}: uv} \boldsymbol{s}_{v, u}(\bmod R) yu​xu​v∈U:uv∑​su,v​−v∈U:uv∑​sv,u​(modR) 其中su,vs_{u, v}su,v​ 为用户 uuu 通过与每一个其他用户进行KA.agree⁡(suSK,svPK)\operatorname{KA.agree}( s_{u}^{S K}, s_{v}^{P K} )KA.agree(suSK​,svPK​) (Key Agreement)得到若当前用户uuu的id大于vvv的id则加密时相加否则相减。直观的可以得到当所有用户上传参数后这些加密 的参数自然而然能够抵消。 问题1 这种方法显然存在问题首先就是巨大的计算和通信开销为了保证加密参数的随机性这种 方法需要对每个模型参数都进行一次KA⁡\operatorname{KA}KA协商那么通信代价为 O(N∗d)\mathbf{O}\left(\mathbf{N}^{*} \mathbf{d}\right)O(N∗d) 其中N\mathbf{N}N为用户总数 d\mathrm{d}d 为向量 维度(模型参数总数)。 解决方案1 论文中对加密方式进行了改造如下所示: yuxu∑v∈U:uvPRG⁡(su,v)−∑v∈U:uvPRG⁡(sv,u)(modR)\boldsymbol{y}_{u}\boldsymbol{x}_{u}\sum_{v \in \mathcal{U}: uv} \operatorname{PRG}\left(s_{u, v}\right)-\sum_{v \in \mathcal{U}: uv} \operatorname{PRG}\left(s_{v, u}\right) \quad(\bmod R) yu​xu​v∈U:uv∑​PRG(su,v​)−v∈U:uv∑​PRG(sv,u​)(modR) 其中PRG⁡\operatorname{PRG}PRG就代表哈希这个式子含义为当所有用户都使用同一个哈希函数并遵循一定的规则就能实现每一对用户都只需要协商一次KA⁡\operatorname{KA}KA并将该值哈希 d\mathrm{d}d 次实现加密式子的随机性便能实现 O(N)\mathbf{O}\left(\mathbf{N}\right)O(N) 的 通信代价。 问题2 如何解决掉线问题 解决方案2 论文使用了shamir大神的秘密共享方案用户 uuu 将自己的私钥 suSKs_{u}^{S K}suSK​ 作为 秘密共享参数把不同的份额分发给其他用户在聚合阶段若用户 uuu 掉线那么通过其他至少ttt个用 户便能恢复出密钥。 问题3 看似已经解决了所有问题但是考虑这种情况若用户uuu很晩才将参数上传但此时服务器判定用 户uuu已经掉线并让其他用户恢复了该用户的私钥那么此时便能破解用户uuu的参数。考虑更坏的情 况好奇的服务器可以撒谎用户uuu掉线这样一来方案还无法构成足够的安全。 最终方案 yuxuPRG(bu)∑v∈U:uvPRG⁡(su,v)−∑v∈U:uvPRG(sv,u)(modR)\begin{aligned} \boldsymbol{y}_{u}\boldsymbol{x}_{u} \mathbf{P R G}\left(\boldsymbol{b}_{u}\right) \\ \sum_{v \in \mathcal{U}: uv} \operatorname{PRG}\left(s_{u, v}\right) \\ -\sum_{v \in \mathcal{U}: uv} \mathbf{P R G}\left(s_{v, u}\right) \quad(\bmod R) \end{aligned} yu​xu​​PRG(bu​)v∈U:uv∑​PRG(su,v​)−v∈U:uv∑​PRG(sv,u​)(modR)​ 其中bub_{u}bu​为用户uuu自行添加的秘密参数和 sus_{u}su​ 一样需要将不同的份额分发给其他用户但是区别就在于 bub_{u}bu​是若用户uuu在线才恢复而sus_{u}su​ 是用户uuu掉线时恢复如此一来一个诚实的用户 vvv便不会同时提交用户uuu的两个秘密份额。 2.4.2 方案具体流程 以用户uuu作为视角作为讨论其余的用户uuu执行的操作与用户相同。 Setup 各方都被赋予了安全参数 kkk , 用户数nnn 和一个门限值ttt , honestly generated pp←KA.gen⁡(k)p p \leftarrow \operatorname{KA.gen} (k)pp←KA.gen(k) , 参数mmm和RRR则 ZRm\mathbb{Z}_{R}^{m}ZRm​ 是对输入进行采样的空间, 和一个用于秘密分享的字段F\mathbb{F}F 。所有用户还具有与服务器的私有身份验证通道。所有用户 uuu 都会从受信任的第三方收到他们的签名密钥 duSKd_{u}^{SK}duSK​以及绑定到每个用户身份 vvv 的验证密钥 dvPKd_{v}^{P K}dvPK​。 Round 0 (AdvertiseKeys) 用户uuu 产生密钥对(cuPK,cuSK)←KA⁡⋅gen⁡(pp),(suPK,suSK)←KA⁡⋅gen⁡(pp)\left(c_{u}^{P K}, c_{u}^{S K}\right) \leftarrow \operatorname{KA} \cdot \operatorname{gen}(p p),\left(s_{u}^{P K}, s_{u}^{S K}\right) \leftarrow \operatorname{KA} \cdot \operatorname{gen}(p p)(cuPK​,cuSK​)←KA⋅gen(pp),(suPK​,suSK​)←KA⋅gen(pp)以及签名σu←SIG⁡⋅sign⁡(duSK,cuPK∥suPK)\sigma_{u} \leftarrow \operatorname{SIG} \cdot \operatorname{sign}\left(d_{u}^{S K}, c_{u}^{P K} \| s_{u}^{P K}\right)σu​←SIG⋅sign(duSK​,cuPK​∥suPK​)将公钥及签名(cuPK∥suPK∥σu)\left(c_{u}^{P K}\left\|s_{u}^{P K}\right\| \sigma_{u}\right)(cuPK​∥∥​suPK​∥∥​σu​) 发送给服务器服务器将公钥路由给其他用 户其他用户拿到用户 uuu 的公钥后与自己的私钥 (cvSK,svSK)\left(c_{v}^{S K}, s_{v}^{S K}\right)(cvSK​,svSK​) 结合便能得到两个共享密钥 cu,vc_{u, v}cu,v​ 用来后续加密传输的信息su,vs_{u, v}su,v​ 用来加密模型参数。 服务器 从上一轮的个人用户中收集至少 ttt 条消息用U1\mathcal{U}_{1}U1​表示这组用户。 否则中止;向 U1\mathcal{U}_{1}U1​ 列表中的所有用户广播 {(v,cvPK,svPK,σv)}v∈U1\left\{\left(v, c_{v}^{P K}, s_{v}^{P K}, \sigma_{v}\right )\right\}_{v \in \mathcal{U}_{1}}{(v,cvPK​,svPK​,σv​)}v∈U1​​; Round 1 (ShareKeys) 将bub_{u}bu​ 与 sus_{u}su​的秘密份额通过Round 0得到的cu,vc_{u, v}cu,v​加密发送给对应的其他用户。 用户uuu 接收由服务器广播得到的列表 {(v,cvPK,svPK,σv)}v∈U1\left\{\left(v, c_{v}^{P K}, s_{v}^{P K}, \sigma_{v}\right)\right\}_{v \in \mathcal{ U}_{1}}{(v,cvPK​,svPK​,σv​)}v∈U1​​ 。 判断以下条件是否满足∣U1∣≥t\left|\mathcal{U}_{1}\right| \geq t∣U1​∣≥t所有的公钥对都是不同的并且 ∀v∈U1,SIG.ver⁡(dvPK,cvPK∥svPK,σu)1\forall v \in \mathcal{U}_{1} , \operatorname{SIG.ver} \left(d_{v}^{PK}, c_{v}^ {P K} \| s_{v}^{P K}, \sigma_{u}\right)1∀v∈U1​,SIG.ver(dvPK​,cvPK​∥svPK​,σu​)1采样一个随机元素 bu←Fb_{u} \leftarrow \mathbb{F}bu​←F用作 PRG 的种子;生成 t -out-of- ∣U1∣\left|\mathcal{U}_{1}\right|∣U1​∣ suSKs_{u}^{SK}suSK​ 的份额{(v,su,vSK)}v∈U1←SS.share⁡(suSK,t,U1)\left\{\left(v, s_{u, v}^{SK}\right)\right\}_{v \in \mathcal{U}_{1 }} \leftarrow \operatorname{SS.share}\left(s_{u}^{SK}, t, \mathcal{U}_{1}\right){(v,su,vSK​)}v∈U1​​←SS.share(suSK​,t,U1​);生成 t -out-of- ∣U1∣\left|\mathcal{U}_{1}\right|∣U1​∣ bub_{u}bu​ 的份额{(v,bu,v)}v∈U1←SS.share⁡(bu,t,U1)\left\{\left(v, b_{u, v}\right)\right\}_{v \in \mathcal{U}_{1}} \leftarrow \operatorname{SS.share}\left(b_{u}, t, \mathcal{U}_{1}\right){(v,bu,v​)}v∈U1​​←SS.share(bu​,t,U1​);对于每个其他用户 v∈U1\{u}v \in \mathcal{U}_{1} \backslash\{u\}v∈U1​\{u} 计算 eu,v←AE.enc⁡(KA.agree⁡(cuSK,cvPK),u∥v∥su,vSK∥bu,v)e_{u, v} \leftarrow \operatorname{AE.e n c}\left(\operatorname{KA.agree} \left(c_{u}^{SK}, c_{v}^{PK}\right), u\|v\| s_{u, v}^{SK} \| b_{u, v}\right)eu,v​←AE.enc(KA.agree(cuSK​,cvPK​),u∥v∥su,vSK​∥bu,v​);如果上述任何操作断言、签名验证、密钥协商、加密失败则中止;将所有密文 eu,ve_{u, v}eu,v​ 发送到服务器每个都隐含地包含寻址信息 u,vu, vu,v 作为元数据;存储本轮收到的所有消息和生成的值然后进入下一轮。 服务器 收集至少 ttt 个用户的密文列表用 U2⊆U1\mathcal{U}_{2} \subseteq \mathcal{U}_{1}U2​⊆U1​ 这组用户表示向每个用户 u∈U2u \in \mathcal{U}_{2}u∈U2​ 发送为其加密的所有密文 {eu,v}v∈U2\left\{e_{u, v}\right\}_{v \in \mathcal{U}_{2} }{eu,v​}v∈U2​​ 并进入下一轮。 Round 2 (MaskedInputCollection) 从服务端收到其他用户发送给自己的秘密份额后根据收到的用户列表计算PRG⁡(su,v)\operatorname{PRG} \left(s_{u, v}\right)PRG(su,v​) 和PRG⁡(bu)\operatorname{PRG}( b_{u} )PRG(bu​)注意这是每个参数都需要哈希一次保证每个位置上的参数加密的数都是随机的。计算完成后将加密后的参数上传给服务器。 Round 3 服务器将收到的模型参数进行聚合并将掉线用户列表发送给所有用户用户通过该列表上传掉线用户的秘密份额 sj′s_{j}^{\prime}sj′​ 和在线用户的秘密份额 bi′b_{i}^{\prime}bi′​服务器收到至少ttt个用户上传的份额后恢复对应参数得到聚合结果。 2.4.3 其它 从上述的方案我们可以得知服务器主要做的路由的作用完成用户之间信息的交换因此服务器有能力对不同的用户宣称不同的用户掉线借此来试图破解shamir秘密共享中的多项式因此原论文还加了一轮一致性检测感兴趣的朋友可以去原论文看看~。 参考文献 内容大部分借鉴了 http://joeybarry.cn/practical-secure-aggregation/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站老域名跳转到新域名阿里巴巴招聘官网

上一讲主要介绍了看板方法以及如何使用看板方法来解决软件研发过程中出现的团队过载、工作不均、任务延期等问题。通过学习前面几个课时介绍的知识,你的团队开始源源不断地交付用户价值。用户对交付的功能非常满意,但等到系统上线后经常出现服务不可用的…

美食网站 原型 html 下载网站咨询弹窗是怎么做的

前言: 爬虫哪家强,当然是python 我是属于啥语言都用,都懂点,不精通,实际工作中能能够顶上就可以。去年写的抓取bing每日的壁纸,保存到本地,并上传到阿里云oss,如果只是本地壁纸切换,存下来就行,一直想做个壁纸站点&…

网站怎么做扫码微信支付接口代理网址怎么用

之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证,我们可以根据用户的身份,提供不同的服务。 …

宁阳移动网站制作免费做背景调查的网站

内核生命周期uboot 打印完 Starting kernel . . .,就完成了自己的使命,控制权便交给了 kernel 的第一条指令,也就是下面这个函数init/main.casmlinkage __visible void __init start_kernel(void){...rest_init();}start_kernel 相当于内核的…

鸿蒙项目实战(九):get请求参数的处理

get请求将键值对数据拼接到url后面,并且进行编码处理(编码空格(转为%20)和中文字符等非保留字符)static async get<T>(url: string, params?: HashMap<string,object>): Promise<T> {if (params…

20250806_信安一把梭_test

流量分析, 应急响应, Webshell, 信安一把梭Tags:流量分析, 应急响应, Webshell, 信安一把梭 0x00. 题目 流量包描述:可恶的黑客,在我的电脑上传了几个奇怪的文件,老师教了我排查但是我没学会,但是我认识大佬你,请…

专业 RAW 图像处理利器!DxO PhotoLab 让你的照片质感飙升

对于摄影爱好者、专业摄影师以及图像后期从业者而言,一款能精准挖掘 RAW 文件潜力、兼顾操作效率与专业功能的图像处理软件,是提升作品质感的核心工具。DxO PhotoLab 作为专业级 RAW 图像处理软件,凭借强大的智能校…

mysql时间转字符串,自定义格式将日期时间值转换为字符串

在 MySQL 中,将时间 / 日期类型转换为字符串可以使用 DATE_FORMAT() 函数,该函数允许你根据自定义格式将日期时间值转换为字符串。 基本语法 sql DATE_FORMAT(date, format) date:要转换的日期 / 时间字段或值(可以…

网站制作工作室制作平台国外网站后缀

指针常量 指针常量&#xff1a;顾名思义它就是一个常量&#xff0c;但是是指针修饰的。 格式为&#xff1a; int * const p //指针常量在这个例子下定义以下代码&#xff1a; int a&#xff0c;b&#xff1b; int * const p&a //指针常量 //那么分为一下两种操作 *p9;//操…

怎么做原创电影视频网站海口智能建站详情

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

苏州吴中长桥网站建设wordpress获取标签链接

目录 一、Nginx概述 1.1 负载均衡概述 1.2 负载均衡的作用 1.3 四/七层负载均衡 1.3.1 网络模型简介 1.3.2 四层和七层负载均衡对比 1.3.3 Nginx七层负载均衡实现 1.4 Nginx负载均衡配置 1.5 Nginx负载均衡状态 1.6 Nginx负载均衡策略 二、负载均衡实战 2.1 测试服…

茌平网站建设菜谱制作小公司企业简介300字

单例模式,是设计模式当中非常重要的一种,在面试中也常常被考察到。 正文如下: 一、什么时候使用单例模式? 单例模式可谓是23种设计模式中最简单、最常见的设计模式了,它可以保证一个类只有一个实例。我们平时网购时用的购物车,就是单例模式的一个例子。想一想,如果购物…

菏泽住房和城乡建设部网站常德论坛市民留言尚一网

目录 一、环境准备二、工作区限制三、什么是计算目标&#xff1f;四、本地计算机五、远程虚拟机六、Apache Spark 池七、Azure HDInsight八、Azure Batch九、Azure Databricks十、Azure Data Lake Analytics十一、Azure 容器实例十二、Kubernetes 了解如何用 SDK v1 将 Azure 计…

万州网站制作凡科建站怎样建站中站

&#xff08;1&#xff09;线程属性 Linux下线程的属性是可以根据实际项目需要&#xff0c;进行设置&#xff0c;之前我们讨论的线程都是采用线程的默认属性&#xff0c;默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性…

网站h5什么意思游戏平台网站开发

1024程序员节当当网计算机图书每满100减50&#xff01;满200减100&#xff01;满300-150&#xff01;机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码&#xff0c;优惠码使用后相当于&#xff1a;400减230 …

哈尔滨智能建站模板什么网站可以找人做设计师

ps切片导出时将切片选项选择为“所有用户切片”&#xff0c;可导出所有切中的区域。转载于:https://www.cnblogs.com/npk19195global/p/4513707.html

网站备案证书放到哪里怎么建设电子商城网站

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 那么来…

其他与其它的区别

“其他”与“其它”在现代汉语中基本可互换,但有细微区别,主要体现在使用习惯和规范上:✅ 规范区别(《现代汉语词典》第7版):词语规范用法举例其他 ✅ 泛指人或事物,更通用 其他人、其他事、其他问题其它 ✅ 仅…

网站后台 登录界面模板 远吗北京手机网站设计报价

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…