具体实施方式
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本说明书的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本说明书应用于其它类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。
应当理解,本文使用的“系统”、“装置”、“单元”和/或“模组”是用于区分不同级别的不同组件、元件、部件、部分或装配的一种方法。然而,如果其他词语可实现相同的目的,则可通过其他表达来替换所述词语。
如本说明书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其它的步骤或元素。
本说明书中使用了流程图用来说明根据本说明书的实施例的系统所执行的操作。应当理解的是,前面或后面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各个步骤。同时,也可以将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。
首先介绍本说明书涉及的一些基本概念。
秘密分享(secret sharing),也称作秘密共享,是一种密码学技术,其将秘密(secret)以一定方式拆分,拆分得到的若干份额(share)由不同的参与方持有,单个参与方无法恢复秘密,只有若干参与方合作,例如公开各自持有的份额,才能恢复秘密。秘密可以是一维数值、数组、向量、矩阵等形式。拆分秘密得到的份额也可称作秘密分享分片,或者简称分片。
安全多方计算(Secure Multiparty Computation, SMPC),英文简称MPC,其解决的是在无可信第三方的情况下,如何安全地计算约定函数的问题。MPC需要同时保证输入的私密性和结果的正确性,即交互计算过程中不能泄露任意一方的私密数据(输入),还要保证计算结果与直接将各方私密数据输入约定函数得到的结果一致。
安全多方计算可以结合秘密分享实现,计算结果(输出)可以以分片形式分布于各方。具体地,通过交互计算,每个参与方可获得约定函数的输出分片,各方获得的输出分片相当于是将各方的私密数据直接输入约定函数后拆分函数输出(秘密)得到的。本说明书中,这种结合秘密分享实现的安全多方计算也被称作秘密分享运算,具体而言可以是秘密分享合并、秘密分享排序等。在一些实施例中,秘密分享运算中,输入和/或中间计算结果也可以分片形式存在,以保护各方数据隐私。
多键排序是指根据多个排序键对应的数据列对待排序数据列进行排序。其中,所述多个排序键对应的数据列是ID对齐(或按行对齐)的。即,当排序键对应的数据列对应目标ID集(包括多个ID)且行的顺序对应初始ID顺序(所述多个ID的初始顺序),待排序数据列也对应于所述目标ID集且元素顺序也对应所述初始ID顺序。在一些实施例中,待排序数据列可以是多个对象的ID组成的ID序列、单个信息项对应的数据列、多个信息项对应的数据列的组合、或者多个ID下的记录组成的序列。本质上,对待排序数据列中元素的排序是对初始顺序的所述多个ID的重新排列,即对初始ID顺序的转换。需要说明的是,本说明书中“列”与“行”应当理解为相对概念,不应将其理解为对数据排布形式的绝对限制。例如,数据列本质上是在描述包含多个元素的数组,也可以看作是数据行,相应的,按行对齐也可以看作是按列对齐。
在一些实施例中,待排序数据列也对应着某个信息项,但是待排序数据列对应的信息项不会作为排序键,即待排序数据列中元素的排序依据是作为排序键的其他信息项。例如存在按行对齐的数据列k1、k2、k3、k4和数据列v,其中数据列k1、k2、k3、k4对应的信息项均作为排序键,数据列v是待排序数据列,其对应的信息项不作为排序键,可以分别基于数据列k1、k2、k3、k4进行迭代排序,排序过程中数据列k1、k2、k3、k4和数据列v始终保持按行对齐。具体的,可以先对数据列k1(即先将信息项k1作为排序键)进行排序(如对数据列k1中的元素进行升序或降序排列),同时基于数据列k1的排序结果对数据列k2、k3、k4和v的元素进行位置调整,以确保排序过程中各数据列始终保持ID对齐,如此,再分别对数据列k2、k3、k4进行排序,得到对待排序数据列v进行多键排序的结果序列。
在一些实施例中,待排序数据列对应的信息项可以作为排序键,例如数据列k1、k2、k3、k4和数据列v对应的信息项均作为排序键,且数据列v是待排序数据列,可以参照前述实施例的方式先基于数据列v进行排序,再分别基于数据列k1、k2、k3、k4进行迭代排序,排序过程中各数据列始终保持按行对齐,进而得到对待排序数据列v进行多键排序的结果序列。
本说明书中提及的排序可以指稳定排序。对于稳定排序,当排序键相同时,ID间相对顺序不变。
多个排序键可以具有优先级关系,这意味着高优先级的排序键对ID顺序的影响优先于低优先级的排序键对ID顺序的影响,即,仅当高优先级排序键相同时才使用低优先级的键进行排序。
多键排序可以为基于多个排序键的联合分组以及组内数据聚合提供基础。仅作为示例,在SQL分析语句中,group by语句先根据用于分组的多个主键对应的数据列进行排序(对于部分聚合函数,待聚合列也参与排序),再执行聚合函数。其中,当所述多个主键中的每一个都相同时,两个或以上ID被划分至同一分组。当然,当单个ID与其他ID相比所述多个主键中的每一个都不同时,单个ID也可自成一组。
以基于k1和k2排序为例,待排序数据列包括5条记录,编号为1到5,要基于k1和k2对这5条记录进行排序,且k1的优先级大于k2的优先级。在通常的做法中,如图2A所示,第一步,按高优先级的k1列进行全ID排序;第二步,对于k1相同的ID(如虚线框所示意,k1的每个值对应一个分组),按低优先级的k2进行组内排序。这种排序方法需要考虑多个ID基于k1的分组情况,不适合通过秘密分享方式实现。
本说明书还提供另一种做法,如图2B所示,第一步,按低优先级的k2列进行排序;第二步,按高优先级的k1列进行排序。由于在按高优先级的k1列进行排序时,k1相同的ID(如k1都等于a的编号3、1)已经按低优先级的k2列排序过,最终得到的结果序列就是满足k1的优先级大于k2的优先级的。这种排序方法无需考虑分组情况,适合通过秘密分享方式实现。应当理解,按照本实施例的做法,先进行排序的排序键具有更低的优先级,但是在一些多键排序的场景中,多个排序键之间并没有人为约束的优先级关系,此时并不限制先基于哪一个排序键进行排序,后基于哪一个排序键进行排序。在另一些多键排序的场景中,多个排序键具有优先级关系,则优先级低的排序键先进行排序。
在一些应用场景下,作为排序键的信息项对应的数据列以及待排序数据列分布在不同方,属于各方的隐私数据,需要在保护各方隐私的前提下基于这些排序键对待排序数据列进行多键排序。有鉴于此,本说明书实施例提供一种基于秘密分享的多键排序方法,通过秘密分享方式实现多键排序。
图1是根据本说明书一些实施例所示的基于秘密分享的多键排序的应用场景示意图。
参考图1,多个数据列垂直分布于第一方(记为A方)和第二方(记为B方)。数据的垂直分布是指,多方拥有同一对象集的信息项但各方拥有的信息项不同。可以用一张二维表格来存储多个对象的多个信息项,其中,每一行对应一个对象,或者说,每一行对应一个ID,每个ID下的多个信息项可合称为该ID下的一条记录,每一列对应一个信息项(如字段)。垂直分布就相当于将完整的二维表格沿垂直方向切分成多个部分,每个部分可以包括一个或多个数据列,所述多个部分可以分布于多方。作为示例,信息项又可以称为字段或字段名,如姓名、年龄、班级等。数据列包括多个元素,每个元素为对应的对象在该数据列对应的信息项下的具体值。例如,例如信息项为姓名,其对应的数据列可以包括“张三”、“李四”、“王五”…。可以理解,垂直分布意味着所述多个数据列是ID对齐的,即,所述多个数据列对应同一对象(ID)集且行的顺序对应同一对象(ID)顺序。
如图1所示,A方拥有三个信息项k1、k2、k3分别对应的数据列,B方拥有信息项k4对应的数据列和信息项v对应的数据列。其中,信息项k1、k2、k3、k4、v中的全部或部分可以作为排序键。可以理解,图1展示的数据垂直分布情况仅仅作为示例。在一些实施例中,任一方可以仅拥有一个信息项对应的数据列,也可以拥有多个信息项分别对应的多个数据列。为了便于描述,可通过信息项区分数据列,如数据列k1、k2、k3、k4和数据列v。双方需要基于秘密分享的多键排序方法,至少依据信息项k1、k2、k3以及k4,对数据列v进行多键排序。
本说明书实施例提供的基于秘密分享的多键排序方法涉及排序向量及其合并,因此,在描述方法前结合附图对排序向量及其合并进行必要说明。
排序向量可以用于标识对等长序列进行排序的操作,排序向量的每个元素可以指示被排序的等长序列中对位元素在结果序列中的位置。具体地,排序向量的第i位元素可以指示被排序的等长序列中第i位元素在结果序列中的位置。以图3为例,序列k经字典升序排列得到序列k'。经过排序,序列k的第0位元素位于序列k'的第0位,序列k的第1位元素位于序列k'的第2位,序列k的第2位元素位于序列k'的第1位,序列k的第3位元素位于序列k'的第4位,序列k的第4位元素位于序列k'的第3位。相应地,用于标识图3所示排序操作的排序向量可以是(0,2,1,4,3)。
排序向量p可以作为排列函数p()作用于等长序列k,得到的结果序列k'=p(k)。
排序向量的合并具有方向性,或者说是有顺序的。先对两个排序向量的合并进行解释。假定合并排序向量p1、p2得到排序向量p,那么满足:p(k)=p2(p1(k))。即,合并得到的排序向量(可称为合并排序向量)标识的是先使用排序向量p1对等长序列进行排序,再使用排序向量p2对前述排序的结果序列进行排序。为了方便描述,用排序合并函数来表示合并前后的排序向量间的关系,记为p=compose(p1,p2),其中,排序合并函数的第一个参数为先使用的排序向量p1,排序合并函数的第二个参数为后使用的排序向量p2。可以理解,两个排序向量的合并可以推广到更多排序向量的合并。例如,依次使用排序向量p1、p2、p3对序列k进行排序,可记为p(k)=p3(p2(p1(k)))。相应地,合并后的排序向量p=compose(compose(p1,p2),p3),其中,compose(compose(p1,p2),p3)可以简化为compose(p1,p2,p3)。
在一些实施例中,两个排序向量p1、p2(顺序为先p1后p2,向量长度为N)的合并可以通过以下流程实现:对于排序向量p1的每个元素(记为p1_i),将p1_i确定为目标位置j(即j=p1_i),并将排序向量p2目标位置j上的元素p2_j确定为合并排序向量p作用的等长序列的第i位元素在结果序列中的位置(即,将p2_j确定为合并排序向量p的第i位元素)。通过遍历i,可以得到合并排序向量p各位置上的元素。关于上述合并流程的示例,可以参考图4及其相关描述。
在一些实施例中,两个排序向量p1、p2(顺序为先p1后p2,向量长度为N)的合并可以通过以下流程实现:对于排序向量p2的每个元素(记为p2_j),将p2_j在排序向量p2中的位置j确定为目标元素,确定目标元素j在排序向量p1中的位置i(即p1_i=j),并将p2_j确定为合并排序向量p作用的等长序列的第i位元素在结果序列中的位置(即,将p2_j确定为合并排序向量p的第i位元素)。通过遍历j,可以得到合并排序向量p各位置上的元素。关于上述合并流程的示例,可以参考图4及其相关描述。
图4示意了排序向量p1、p2、p3的合并逻辑。图4上方表格示意了排序过程中序列中元素位置的变化,排序向量p1作用于k得到序列k1,排序向量p2作用于k1得到序列k2,排序向量p3作用于k2得到序列k3,排序向量p作用于序列k得到序列k3。图4下方表格中的连线示意了合并向量各位置上的元素的获得途径。例如,如图4中加粗部分所示,对于i=0,p1_0=4,p2_4=2,则compose(p1,p2)的第0位元素为2;对于j=2,p3_2=3,compose(p1,p2)的第0位元素为2,则p_0=3。
图5是根据本说明书一些实施例所示的基于秘密分享的多键排序方法的示例性交互流程图。其中,第一方拥有一个或多个第一信息项对应的第一数据列,第二方拥有一个或多个第二信息项分别对应的第二数据列。第一数据列和第二数据列可以都对应目标ID集(包括多个ID)且行的顺序都对应初始ID顺序(所述多个ID的初始顺序),即,第一数据列和第二数据列可以是ID对齐的。如图5所示,流程500可以包括以下步骤:
步骤110,第一方将所述一个或多个第一信息项分别作为排序键对所述一个或多个第一数据列进行迭代排序,得到第一结果序列。在一些实施例中,步骤110可以由第一结果序列获得模块1510执行。
当仅有一个第一信息项作为排序键时,第一方可以直接对该第一信息项对应的第一数据列进行排序(如升序或降序排序),得到第一结果序列。当有多个第一信息项作为排序键时,第一方可以将多个第一信息项分别作为排序键对多个第一数据列进行迭代排序,得到第一结果序列。这一过程也可以看作是对各第一数据列进行多键排序的过程。例如,第一方拥有ID对齐的数据列k1、k2、k3,可以先对数据列k1(即先将信息项k1作为排序键)进行排序,同时基于数据列k1的排序结果对数据列k2、k3的元素进行位置调整,以确保排序过程中各数据列始终保持ID对齐,如此,再分别对数据列k2、k3进行排序。此时,第一结果序列可以是指经过迭代排序的数据列k1、k2、k3,第一结果序列中的元素可以看作包括经过迭代排序的数据列k1、k2、k3中与其位置对应的三个元素。在迭代排序中,越先使用的第一排序键在多个排序键中优先级越低。
步骤120,第一方基于第一结果序列获得第一分组标记列。在一些实施例中,步骤120可以由第一分组标记列获得模块1520执行。
其中,第一分组标记列的元素位置与第一数据列的元素位置可以是一一对应的,这意味着第一分组标记列与第一数据列的同一行对应同一ID。第一分组标记列的元素可以指示所述一个或多个第一数据列中的对位元素依据所述一个或多个第一信息项的联合分组信息。这里的联合分组信息可以指依据所述一个或多个第一信息项进行分组时,ID属于哪个分组。当仅有一个第一信息项作为排序键时,该第一信息项相同的ID可以被划分至同一分组。当有多个第一信息项作为排序键时,所述多个第一信息项中的每一个都相同的ID可以被划分至同一分组。以图2A作为示例,当仅有k1作为排序键时,ID1、3属于第1组,ID2、5属于第2组,ID4属于第3组,此时第一分组标记列可以为(1,2,1,3,2),其中的元素指示原数据列(元素顺序对应初始ID顺序)中对位元素所属的分组。当k1、k2作为排序键时,ID1、2、3、4、5分别自成一组,此时第一分组标记列可以为(1,2,3,4,5)。
第一分组标记列记录了所述一个或多个第一数据列中的对位元素(即各ID)依据所述一个或多个第一信息项的联合分组信息,自然也记录了依据所述一个或多个第一信息项对所述一个或多个第一数据列中的对位元素(即各ID)的多键排序信息。例如,将第一分组标记列(1,2,1,3,2)进行基数排序(如升序)时,便可以得到第一排序向量,第一排序向量可以标识将所述一个或多个第一信息项分别作为排序键对等长序列进行多键排序的操作。在一些实施例中,可以根据第一结果序列和第一排序向量生成第一分组标记列。关于根据第一结果序列和第一排序向量生成第一分组标记列的具体流程,可以参考图11及其相关描述。
步骤210,第二方基于所述一个或多个第二数据列生成第二排序向量。在一些实施例中,步骤210可以由第二排序向量生成模块1610执行。
其中,第二排序向量(记为PB)可以用于标识将所述一个或多个第二信息项分别作为排序键对等长序列进行多键排序的操作。对等长序列的多键排序操作可以是指以所述一个或多个第二信息项为排序键,对所述一个或多个第二数据列以及该等长序列进行迭代排序,且排序过程中各数据列和等长序列保持ID对齐(可以视为该等长序列也对应所述目标ID集且元素顺序对应所述初始ID顺序)。关于迭代排序的具体过程类似步骤110中对多个第一数据列进行迭代排序,得到第一结果序列的过程。例如,第二方拥有数据列k4、k5,可以先对数据列k5(即先将信息项k5作为排序键)进行排序,同时基于数据列k5的排序结果对数据列k4和所述等长序列的元素进行位置调整,以确保排序过程中各数据列始终保持ID对齐,如此,再对数据列k4进行排序。第二排序向量的元素可以指示该等长序列中对位元素在其结果序列中的位置。
在一些实施例中,待排序数据列对应的信息项也需要作为排序键,此时可以将待排序数据列看作一个第二数据列进行处理,以得到所述第二排序向量。例如,第二方拥有ID对齐的数据列k4、v,可以先对数据列v(即先将信息项v作为排序键)进行排序,同时基于数据列v的排序结果对数据列k4和所述等长序列的元素进行位置调整,以确保排序过程中各数据列始终保持ID对齐,如此,再对数据列k4进行排序。第二排序向量的元素可以指示该等长序列中对位元素在其结果序列中的位置。本实施例适用于对数据列v进行多排序键的联合分组后再进行组内聚合,且组内聚合运算可以是求最大值、求最小值或求中位数的场景。
在一些实施例中,第二方可以基于所述一个或多个第二数据列对初始顺序的所述多个ID进行重新排列得到第二ID顺序,并根据第二ID顺序相较于所述初始顺序的变化确定第二排序向量。可以理解,ID顺序的变化可以反映排序操作,因此根据ID顺序的变化可以确定相应的排序向量。对于多个(假设为N个,N ≥2)第二数据列,第二方可以基于所述N个第二数据列(按对应的轮次分别记为k1~kN)对初始顺序的所述多个ID进行N轮迭代的重新排列,具体地,第i轮(1≤i≤N)中,第二方可以对对应ID顺序Si-1的第二数据列ki进行排序,得到ID顺序Si。可以理解,ID顺序S0即所述初始顺序,ID顺序SN即第二ID顺序。
以图6为例,第二方(B方)拥有作为排序键的第二信息项k3和v。首先,第二方可以对对应初始ID顺序(0,1,2,3,4,5,6,7,8,9)的待聚合列v进行大小升序排列,得到对应ID顺序(0,6,5,1,3,4,8,9,2,7)的待聚合列v。接着,第二方可以对对应ID顺序(0,6,5,1,3,4,8,9,2,7)的第二数据列k3进行大小升序排列,得到对应ID顺序(0,1,8,9,7,6,5,3,4,2)的第二数据列k3。其中,(0,1,8,9,7,6,5,3,4,2)即第二ID顺序。初始ID顺序(0,1,2,3,4,5,6,7,8,9)到第二ID顺序(0,1,8,9,7,6,5,3,4,2)变化为:第0位的0移至第0位,第1位的1移至第1位,第2位的2移至第9位,第3位的3移至第7位,第4位的4移至第8位,第5位的5移至第6位,第6位的6移至第5位,第7位的7移至第4位,第8位的8移至第2位,第9位的9移至第3位。相应地,可以确定第二排序向量PB=(0,1,9,7,8,6,5,4,2,3)。
在一些实施例中,可以通过一轮或多轮迭代的排序向量合并获得第二排序向量。关于通过合并排序向量获得第二排序向量的具体流程,可以参考图13及其相关描述。
以下多组步骤均涉及秘密分享运算。
步骤130,第一方将第一分组标记列作为待排序序列,与第二方将第二排序向量作为排序向量,进行秘密分享向量排序,得到经过排序的第一分组标记列的第一分片。在一些实施例中,步骤130可以由第一秘密分享向量排序模块1530执行。
步骤230,第二方将第二排序向量作为排序向量,与第一方将第一分组标记列作为待排序序列,进行秘密分享向量排序,得到经过排序的第一分组标记列的第二分片。在一些实施例中,步骤230可以由第二秘密分享向量排序模块1630执行。
秘密分享向量排序中,第一方和第二方各自提供输入,并各自获得结果序列的分片。对于输入,第一方拥有待排序序列(记为X),第二方拥有排序向量(记为π)。在一些实施例中,待排序序列X可以直接作为第一方的独立输入。在一些实施例中,排序向量π可以直接作为第二方的独立输入。在一些实施例中,第一方可以将待排序序列X拆分成第一分片<X>A和第二分片<X>B并将第二分片<X>B发送给第二方。如此,第一方可以提供待排序序列X的第一分片<X>A作为输入,第二方可以提供待排序序列X的第二分片<X>B作为输入。在一些实施例中,第二方可以将排序向量π拆分成第一分片<π>A和第一分片<π>A并将第一分片<π>A发送给第一方。如此,第一方可以提供排序向量π的第一分片<π>A作为输入,第二方可以提供排序向量π的第二分片<π>B作为输入。
仅作为示例,本说明书提及的秘密分享向量排序可以通过如图7所示的四种密文向量排序算子实现。其中,密文向量排序算子由两方(P0和P1)共同运行。对于密文向量排序算子a:P0提供排序向量π作为输入,并获得结果序列π(X)的分片<π(X)>0;P1提供待排序序列X作为输入,并获得结果序列π(X)的分片<π(X)>1。对于密文向量排序算子b:P0提供排序向量π的分片<π>0和待排序序列X的分片<X>0和作为输入,并获得结果序列π(X)的分片<π(X)>0;P1提供排序向量π的分片<π>1和待排序序列X的分片<X>1作为输入,并获得结果序列π(X)的分片<π(X)>1。对于密文向量排序算子c,P0提供排序向量π和待排序序列X的分片<X>0作为输入,并获得结果序列π(X)的分片<π(X)>0;P1提供待排序序列X的分片<X>1作为输入,并获得结果序列π(X)的分片<π(X)>1。对于密文向量排序算子d,P0提供排序向量π的分片<π>0作为输入,并获得结果序列π(X)的分片<π(X)>0;P1提供排序向量π的分片<π>1和待排序序列X作为输入,并获得结果序列π(X)的分片<π(X)>1。
本说明书不对密文向量排序算子的内部实现算法进行限制,只将其作为黑盒算子进行调用。应当理解,凡是目前已经出现的以及未来会出现的,能够实现密文向量排序算子功能的数据处理/运算单元、程序代码、机器学习模型等各种方式均可用于实现本说明书提到的秘密分享向量排序。
以第一参与方和第二参与方协同作为示例,其中,第一参与方持有目标排序向量、待排序数据列的第一分片,第二参与方持有所述待排序数据列的第二分片,密文向量排序算子c的一种实现方式可以包括:
第一参与方从可信第三方获取第一排序向量、第一数据列的第一分片和基于所述第一排序向量对所述第一数据列进行排序的第一结果序列的第一分片。第二参与方从可信第三方处获取第一数据列的第二分片和第一结果序列的第二分片。
第一参与方基于目标排序向量和所述第一排序向量确定第二排序向量,并将其发送给第二参与方;在一些实施例中,基于所述第一排序向量对所述目标排序向量进行排序,得到的结果序列可以作为所述第二排序向量。
第一参与方将待排序数据列的第一分片与第一数据列的第一分片作差,获得第二数据列的第一分片,同时从第二方获取第二数据列的第二分片;第二数据列的第二分片为第二参与方将待排序数据列的第二分片与第一数据列的第二分片作差得到。
第一参与方基于第二数据列的第一分片以及第二数据列的第二分片,获得第二数据列,并基于目标排序向量对第二数据列进行排序,得到第二结果数据列;基于第二排序向量对所述第一结果数据列的第一分片进行排序,得到第三结果数据列;最后,对第二结果数据列和第三结果数据列求和,获得目标数据列的第一分片。
第二参与方基于第二排序向量对第一结果序列的第二分片进行排序,获得目标数据列的第二分片。所述目标数据列等于基于所述目标排序向量对所述待排序数据列进行排序的结果序列。
第二排序向量作用于对应初始ID顺序的第一分组标记列后,得到对应第二ID顺序的第一分组标记列,即所述经过排序的第一分组标记列。由于第二排序向量用于标识将所述一个或多个第二信息项分别作为排序键对等长序列进行多键排序的操作,因此可以认为所述经过排序的第一分组标记列已基于所述一个或多个第二信息项进行了多键排序。
步骤140,第一方基于所述经过排序的第一分组标记列的第一分片,与第二方基于所述经过排序的第一分组标记列的第二分片,进行秘密分享基数排序,得到第三排序向量的第一分片。在一些实施例中,步骤140可以由第一秘密分享基数排序模块1540执行。
步骤240,第二方基于所述经过排序的第一分组标记列的第二分片,与第一方基于所述经过排序的第一分组标记列的第二分片,进行秘密分享基数排序,得到第三排序向量的第二分片。在一些实施例中,步骤240可以由第二秘密分享基数排序模块1640执行。
基数排序可指基于预设条件对待排序序列(排序向量作用的等长序列)进行排序,得到结果序列,其中预设条件可以是升序排列或降序排列等。这里举一个例子,假设待排序序列为(2,1,3,0),按大小升序对此序列进行基数排序,可获得结果序列(0,1,2,3)。同样可以使用一排序向量来标识对所述待排序序列进行基数排序的操作,其元素指示所述待排序序列中对位元素在结果序列中的位置。待排序序列为(2,1,3,0)到结果序列(0,1,2,3)的变化反映了基数排序操作,基于此,可以确定排序向量为(2,1,3,0),其标识的排序操作为:将第0位的2排至第2位,将第1位的1排至第1位,将第2位的3排至第3位,将第3位的0排至第0位。本实施例中,用第三排序向量来标识对经过排序的第一分组标记列的基数排序操作。
主要参考图8,第一方(A方)拥有数据列k1和k2,第二方(B方)拥有数据列k3和待聚合列v。数值列按大小升序排列,英文字母列按字典升序排列,排序键的优先级关系为k1>k2>k3>v,“>”表示前者的优先级高于后者的优先级。第一方基于步骤110和步骤120处理数据列k1和k2可以得到第一分组标记G,第二方基于步骤210处理数据列k3和v得到第二排序向量PB。第二排序向量PB(参考图6、图14)用于标识将第二信息项v和k3分别作为排序键对等长序列进行迭代排序的操作,第二排序向量PB的生成可以参考图6。使用第二排序向量PB对对应初始ID顺序(0,1,2,3,4,5,6,7,8,9)的第一分组标记列G(参考图12)进行排序,得到对应第二ID顺序(0,1,8,9,7,6,5,3,4,2)的第一分组标记列G'(即所述经过排序的第一分组标记列)。对对应第二ID顺序(0,1,8,9,7,6,5,3,4,2)的第一分组标记列G'中的分组编号进行基数排列(如升序),可以得到标记列G'',其对应目标ID顺序(0,1,7,2,4,6,5,3,8,9)。第二ID顺序(0,1,8,9,7,6,5,3,4,2)到目标ID顺序(0,1,7,2,4,6,5,3,8,9)的变化反映的排序操作为:将第0位的0排至第0位,将第1位的1排至第1位,将第2位的8排至第8位,将第3位的9排至第9位,将第4位的7排至第2位,将第5位的6排至第5位,将第6位的5排至第6位,将第7位的3排至第7位,将第8位的4排至第4位,将第9位的2排至第3位。综上,基于对应第二ID顺序的第一分组标记列可以确定第三排序向量PA'=(0,1,8,9,2,5,6,7,4,3)。
如图9所示,第一方(A方)和第二方(B方)可以共同运行密文基数排序算子,以获得能够对对应第二ID顺序的第一分组标记列G'进行顺序(如升序)排序的排序向量(即第三排序向量)。第一方提供对应第二ID顺序的第一分组标记列(即所述经过排序的第一分组标记列)G'的第一分片<G'>A作为输入,并获得第三排序向量PA'的第一分片< PA'>A。第二方提供对应第二ID顺序的第一分组标记列G'的第二分片<G'>B作为输入,并获得第三排序向量PA'的第二分片< PA'>B。
如图9所示,更为一般的,密文基数排序算子可以将一个长度为n的秘密分享序列<G>进行秘密顺序(如升序或降序)排列,得到仍然以秘密分享的形式存在的排列结果< PA'>,<>表示密文形式,具体可以是分片形式。密文基数排序算子可以理解为一个功能函数,其一组输入数据包括待排序数据列的第一分片,来自第一参与方,其另一组输入数据包括待排列数据列的第二分片,来自第二参与方;其输出数据为包括目标排序向量的第一分片和第二分,分别由第一参与方、第二参与方获得。
目前已有密文基数排序算子的多种实现方式,本说明书不对其内部实现算法进行限制,只将其作为黑盒算子进行调用。应当理解,凡是目前已经出现的以及未来会出现的,能够实现密文基数排序算子功能的数据处理/运算单元、程序代码、机器学习模型等各种方式均可作为本说明书提到的密文基数排序算子。
以第一参与方和第二参与方协同作为示例,其中,第一参与方持有二进制形式的待排序数据列的第一分片,第二参与方持有所述待排序数据列的第二分片,密文基数排序算子的一种实现方式可以包括双方协同执行多轮迭代,最后一轮迭代得到的第二排序向量的分片为所述目标排序向量的分片;其中一轮迭代包括:
第一参与方在待排序数据列第一分片的每个元素中取同一位的子元素,得到第一位列的第一分片;第二参与方在待排序数据列第二分片的每个元素中取同一位的子元素,得到第一位列的第二分片;
第一参与方基于第一位列的第一分片和第一排序向量的第一分片,与第二参与方基于第一位列的第二分片和第一排序向量的第二分片,通过第一秘密分享排序算法,得到第一排序位列的第一分片,第二参与方获得第一排序位列的第二分片;所述第一排序位列为使用第一排序向量对所述第一位列进行排序的结果序列;当所述一轮迭代为第一轮迭代时,所述第一排序向量为元素顺序排列的初始排序向量,否则所述第一排序向量为前一轮迭代得到的第二排序向量;
第一参与方基于第一排序位列的第一分片得到拓展标志序列的第一分片;其中,所述拓展标志序列包括均与第一排序位列等长的第一子序列和第二子序列;所述第一子序列的元素反映所述第一排序位列中的对位元素是否为第一数值;所述第二子序列的元素反映所述第一排序位列中的对位元素是否为第二数值;第二参与方以同样的方式获得拓展标志序列的第二分片;
第一参与方基于所述拓展标志序列的第一分片确定中间排序向量的第一分片,第二参与方基于所述拓展标志序列的第二分片确定中间排序向量的第二分片,所述中间排序向量能够将第一位列中的元素进行顺序排列;
第一参与方基于第一排序向量的第一分片和所述中间排序向量的第一分片,与第二参与方基于第一排序向量的第二分片和所述中间排序向量的第二分片,通过秘密分享合并算法,得到第二排序向量的第一分片,第二参与方获得第二排序向量的第二分片;基于第二排序向量对等长序列进行排序的结果序列等于基于所述第一排序向量和中间排序向量对所述等长序列进行迭代排序的结果序列。
在一些实施例中,所述第一数值为0,所述第二数值为1;第一参与方基于第一排序位列的第一分片得到拓展标志序列的第一分片,包括:对第一预设位列与第一排序位列按位求差,得到所述拓展标志序列的第一子序列的第一分片;所述第一预设位列与第二参与方的第二预设位列按位求和的结果为全1序列;将所述第一排序位列作为所述拓展标志序列的第二子序列的第一分片。第二参与方类似的获得拓展标志序列的第二分片。
在一些实施例中,第一参与方基于所述拓展标志序列的第一分片确定中间排序向量的第一分片,进一步包括:对所述拓展标志序列的第一分片进行前缀求和得到拓展求和序列的第一分片;基于所述拓展标志序列的第一分片和所述拓展求和序列的第一分片,与第二参与方基于所述拓展标志序列的第二分片和所述拓展求和序列的第二分片,通过秘密分享乘法协议,得到拓展排序序列的第一分片,第二参与方获得拓展排序序列的第二分片;拓展排序序列等于所述拓展标志序列和所述拓展求和序列按位相乘的结果;将所述拓展排序序列中的第一子序列的第一分片和第二子序列的第一分片按位求和,以得到所述中间排序向量的第一分片。第二参与方类似的获得中间排序向量的第二分片。
在一些实施例中,当所述一轮迭代为第一轮迭代时,在待排序数据列第一分片的每个元素中取最低位的子元素,得到所述第一位列的第一分片;当所述一轮迭代为第二轮迭代时,在待排序数据列第一分片的每个元素中取次低位的子元素,得到所述第一位列的第一分片;以此类推,当所述一轮迭代为最后一轮迭代时,在待排序数据列第一分片的每个元素中取最高位的子元素,得到所述第一位列的第一分片。
在一些实施例中,第一秘密分享排序算法可以由图7中的密文向量排序算子b实现,可记为Permute函数或算子:<π(X)>=Permute(<π>,<X>),其中<>表示密文形式,具体可以是分片形式。Permute函数可以理解为一个功能函数,其一组输入数据包括排列序列的第一分片<π>0和待排列序列的第一分片<X>0,来自第一参与方,其另一组输入数据包括排列序列的第二分片<π>1和待排列序列的第二分片<X>1,来自第二参与方;其输出数据为包括结果序列的第一分片<π(X)>0和第二分片<π(X)>1,结果序列的第一分片由第一参与方获得,结果序列的第二分片由第二参与方获得。
在一些实施例中,两方的处理设备可以分别执行Permute函数中的流程,目前已有Permute函数的多种实现方式,本说明书不对其内部实现算法进行限制,只将其作为黑盒算子进行调用。应当理解,凡是目前已经出现的以及未来会出现的,能够实现Permute函数功能的数据处理/运算单元、程序代码、机器学习模型等各种方式均可作为本说明书提到的第一秘密分享排序算法。
以第一参与方和第二参与方协同作为示例,其中,第一参与方持有待排序序列的第一分片和排序序列的第一分片,第二参与方持有待排序序列的第二分片和排序序列的第二分片,Permute函数的一种实现方式可以包括:
第一参与方基于待排序序列的第一分片,与所述第二参与方基于所述待排序序列的第二分片,通过秘密分享排列协议,获得待排序乱序序列的第一分片;所述第二参与方获得所述待排序乱序序列的第二分片;
第一参与方基于排序序列的第一分片,与所述第二参与方基于所述排序序列的第二分片,通过秘密分享排列协议,获得乱序排序序列的第一分片;所述第二参与方获得所述乱序排序序列的第二分片;且对排序序列的乱序方式与待排序序列的乱序方式相同;
第一参与方从所述第二参与方获得所述乱序排序序列的第二分片,得到所述乱序排列序列;
第一参与方基于所述乱序排序序列和所述待排序乱序序列的第一分片,与所述第二参与方基于所述待排序乱序序列的第二分片,通过秘密分享排列协议,获得结果序列的第一分片;第二参与方获得结果序列的第二分片;所述结果序列等于基于所述排序序列对所述待排序序列进行排序的结果。
示例性的,所述基于待排序序列的第一分片,与所述第二参与方基于所述待排序序列的第二分片,通过秘密分享排列协议,获得待排序乱序序列的第一分片;所述第二参与方获得所述待排序乱序序列的第二分片,进一步包括:
第一参与方生成第一随机排序序列;
第一参与方基于所述第一随机排序序列以及所述待排序序列的第一分片,与第二参与方基于所述待排序序列的第二分片,通过秘密分享排列协议,获得第一乱序中间序列的第一分片;第二参与方获得第一乱序中间序列的第二分片;
第一参与方基于所述第一乱序中间序列的第一分片,与第二参与方基于第一乱序中间序列的第二分片以及第二随机排序序列,通过秘密分享排列协议,获得所述待排序乱序序列的第一分片;第二参与方获得待排序乱序序列的第二分片,所述第二随机排序序列由第二参与方生成。
上述秘密分享排列协议可以是图7中的算子c,其具体实现可以在步骤130和步骤230的相关说明中找到。
在一些实施例中,秘密分享合并算法又可记为compose函数或算子:
,其中<>表示密文形式,具体可以是分片形式。
compose函数可以理解为一个功能函数,其一组输入数据包括秘密分享的第一排列函数(或
称为排序序列、排序向量)的第一分片<M1>
A和秘密分享的第二排列函数的第一分片<M2>
A,
来自第一参与方,其另一组输入数据包括秘密分享的第一排列函数的第二分片<M1>
B和秘
密分享的第二排列函数的第二分片<M2>
B,来自第二参与方;其输出数据为合并后的秘密分
享排序向量的第一分片<M>
A和第二分片<M>
B,合并后的秘密分享排序向量的第一分片由第
一参与方获得,合并后的秘密分享排序向量的第二分片由第二参与方获得。
在一些实施例中,两方的处理设备可以分别执行compose函数中的流程,目前已有compose函数的多种实现方式,本说明书不对其内部实现算法进行限制,只将其作为黑盒算子进行调用。应当理解,凡是目前已经出现的以及未来会出现的,能够实现compose函数功能的数据处理/运算单元、程序代码、机器学习模型等各种方式均可作为本说明书提到的基于秘密分享排列协议。
以第一参与方和第二参与方协同作为示例,其中,第一参与方持有第一排序序列的第一分片以及第二排序序列的第一分片;第二参与方持有第一排序序列的第二分片以及第二排序序列的第二分片,compose函数的一种实现方式可以包括:
第一参与方基于第一排序序列的第一分片,与第二参与方基于第一排序序列的第二分片,通过秘密分享排列协议,获取第一排序乱序序列的第一分片;第二参与方获得第一排序乱序序列的第二分片;
第一参与方将第一排序乱序序列的第一分片发送给第二参与方,并从第二参与方接收第一排序乱序序列的第二分片,进而获取第一排序乱序序列;同时第二参与方也能获得第一排序乱序序列;
第一参与方基于所述第一排序乱序序列和第二排序序列的第一分片,按照前述明文合并算法获取合并排序乱序序列的第一分片;同时,第二参与方基于所述第一排序乱序序列和第二排序序列的第二分片,按照明文合并算法获取合并排序乱序序列的第二分片;
第一参与方基于所述合并排序乱序序列的第一分片,与第二参与方基于合并排序乱序序列的第二分片,通过秘密分享排列协议,获取合并排序序列的第一分片;第二参与方获得合并排序序列的第二分片;基于所述合并排序序列对等长序列进行排序的结果等于将基于所述第一排序序列和所述第二排序序列对所述等长序列进行迭代排序的结果。
其中,秘密分享排列协议的具体实现可以参见步骤130和步骤230中关于算子c的相关说明;参与方基于第一排序序列的分片获取第一排序乱序序列的分片的详细内容可以参见前述获得待排序乱序序列的分片的具体实现。
在一些实施例中,所述第一参与方基于所述合并排序乱序序列的第一分片,与第二参与方基于合并排序乱序序列的第二分片,通过秘密分享排列协议,获取合并排序序列的第一分片;第二参与方获得合并排序序列的第二分片,可以进一步包括:
第一参与方生成所述第一随机排序序列的逆序列;
第一参与方基于所述合并排序乱序序列的第一分片,与第二参与方基于合并排序乱序序列的第二分片以及所述第二随机排序序列的逆序列,通过秘密分享排列协议,获得合并还原中间序列的第一分片;第二参与方获得合并还原中间序列的第二分片,所述第二随机排序序列的逆序列由第二参与方生成;
第一参与方基于所述合并还原中间序列的第一分片以及第一随机排序序列的逆序列,与第二参与方基于合并还原中间序列的第二分片,通过秘密分享排列协议,获得所述合并排序序列的第一分片;第二参与方获得合并排序序列的第二分片。
在一些实施例中,生成某随机排序序列的逆序列,包括:生成与该随机排序序列等长的正序序列;基于该随机排序序列对所述正序序列进行排序,得到的结果序列即为该随机排序序列的逆序列。
正序序列可以是指元素按照从小到大的顺序进行排列的序列。作为示例,可以是将第一随机排序序列的元素按照从小到大的顺序进行排列得到的序列。第一参与方的处理设备使用第一随机排序序列对正序序列进行排序后即可得到对应的逆序列。例如,假设第一随机排序序列为R0=[3 2 0 1],等长的正序序列为R=[0 1 2 3],使用第一随机排序序列对等长的正序序列进行排序后可得逆序列R1=[2 3 1 0]。对其进行验证,假设待排序的序列X=[B C A D],使用R0对X进行排序可得X1=[A D C B],使用R1对X1进行排序还原可得[BC A D]=X。
所述经过排序的第一分组标记列已基于所述一个或多个第二信息项进行了多键排序。由于第一分组标记列的元素记录了依据所述一个或多个第一信息项对所述一个或多个第一数据列中的对位元素(即各ID)的多键排序信息,因此,将所述经过排序的第一分组标记列G'进行基数排序(如升序)得到的标记列G''相当于已依据所述一个或多个第二信息项以及所述一个或多个第一信息项进行了多键排序。为了获取标识对将所述一个或多个第一信息项和所述一个或多个第二信息项分别作为排序键对等长序列进行迭代排序操作的多方排序向量,还需要考虑将标识从G'到G''的排序操作的第三排序向量作用于已基于所述一个或多个第二信息项进行了多键排序的第二数据列,以确保各数据列始终保持ID对齐,因此,接下来需要将第三排序向量与第二排序向量进行合并。
步骤150,第一方基于第三排序向量的第一分片,与第二方基于第三排序向量的第二分片以及第二排序向量,进行秘密分享合并,得到多方排序向量的第一分片。在一些实施例中,步骤150可以由第一秘密分享合并模块1550执行。
步骤250,第二方基于第三排序向量的第二分片,与第一方基于第三排序向量的第一分片以及第二排序向量,进行秘密分享合并,得到多方排序向量的第二分片。在一些实施例中,步骤250可以由第二秘密分享合并模块1650执行。
其中,多方排序向量可以用于标识将所述一个或多个第一信息项和所述一个或多个第二信息项分别作为排序键对等长序列进行迭代排序的操作,即,多方排序向量(记为P)为第二排序向量(记为PB)和第三排序向量(记为PA')的合并排序向量,记为P=compose(PB,PA')。该等长序列对应所述目标ID集且元素顺序对应所述初始ID顺序,多方排序向量作用于该等长序列后,得到对应最终ID顺序的结果序列。例如,被排序的等长序列可以是待排序数据列,多方排序向量作用于待排序数据列后,得到对应目标ID顺序的目标数据列。
秘密分享合并中,第二方可以将第二排序向量PB作为独立的输入。第二方也可以将第二排序向量PB拆分成第一分片<PB>A和第二分片<PB>B并将第一分片<PB>A发送给第一方。如此,第一方可以提供第二排序向量PB的第一分片<PB>A作为输入,第二方可以提供第二排序向量PB的第二分片<PB>B作为输入。
本说明书中提及的秘密分享合并可以通过如图10所示的两种密文合并算子实现。其中,密文合并算子由两方(P0和P1)共同运行。对于密文合并算子a:P0(如A方)提供排序向量M2(如第三排序向量PA')的分片<M2>0作为输入,并获得合并排序向量M(compose(M1,M2),如多方排序向量P)的分片<M>0;P1(如B方)提供排序向量M1(如第二排序向量PB)和排序向量M2的分片<M2>1作为输入,并获得合并排序向量M的分片<M>1。对于密文合并算子b:P0(如A方)提供排序向量M1(如第二排序向量PB)的分片<M1>0和排序向量M2(如第三排序向量PA')的分片<M2>0作为输入,并获得合并排序向量M(compose(M1,M2),如多方排序向量P)的分片<M>0;P1(如B方)提供排序向量M1的分片<M1>1和排序向量M2的分片<M2>1作为输入,并获得合并排序向量M的分片<M>0。关于密文合并算子b的更多内容可以参见步骤140和步骤240中关于compose函数的相关说明。
步骤160,第一方基于多方排序向量的第一分片,与第二方基于多方排序向量的第二分片,对待排序数据列进行秘密分享向量排序,得到目标数据列的第一分片。在一些实施例中,步骤160可以由第一多键排序模块1560执行。
步骤260,第二方基于多方排序向量的第二分片,与第二方基于多方排序向量的第二分片,对待排序数据列进行秘密分享向量排序,得到目标数据列的第二分片。在一些实施例中,步骤260可以由第二多键排序模块1660执行。
其中,待排序数据列对应所述目标ID集且行的顺序对应所述初始ID顺序,所述目标数据列等于将所述一个或多个第一信息项以及所述一个或多个第二信息项分别作为排序键对待排序数据列进行多键排序的结果。
在一些实施例中,第一方可以基于多方排序向量的第一分片,与第二方基于多方排序向量的第二分片以及待排序数据列,进行秘密分享向量排序,得到目标数据列的第一分片。其中,待排序数据列可以是第二方的本地数据列,如所述一个或多个第二数据列。步骤160和步骤260可以通过图7所示的密文向量排序算子d实现。
在一些实施例中,第一方可以基于多方排序向量的第一分片、待排序数据列的第一分片,与第二方基于多方排序向量的第二分片、待排序数据列的第二分片,进行秘密分享向量排序,得到目标数据列的第一分片。其中,第一方和第二方可以通过秘密分享运算分别获得待排序数据列的第一分片和第二分片。步骤160和步骤260可以通过图7所示的密文向量排序算子b实现。
图11是根据本说明书一些实施例所示的根据第一结果序列和第一排序向量生成第一分组标记列的示例性流程图。如图11所示,流程1100可以包括以下步骤:
步骤1110,基于第一结果序列获得待重排的分组标记列。
其中,所述待重排的分组标记列的元素位置与第一结果序列的元素位置可以是一一对应的,这意味着所述待重排的分组标记列与第一结果序列均对应第一ID顺序。所述待重排的分组标记列的元素可以指示第一结果序列中对位元素依据所述一个或多个第一信息项的联合分组信息。
步骤1120,获得第一排序向量的逆。
其中,第一排序向量(记为PA)可以用于标识将所述一个或多个第一信息项分别作为排序键对等长序列进行多键排序的操作。该等长序列对应所述目标ID集且元素顺序对应所述初始ID顺序,第一排序向量作用于该等长序列后,得到对应第一ID顺序的结果序列。也就是说,根据第一排序向量可以将初始ID顺序转换成第一ID顺序。第一排序向量的元素位置与被排序的等长序列的元素位置可以是一一对应的,这意味着第一排序向量与第一数据列的同一行对应同一ID。第一排序向量的元素可以指示该等长序列中对位元素在结果序列中的位置。
第一排序向量的逆(记为PA_inv)可以用于标识对基于排序向量对等长序列进行排序得到的结果序列进行还原的操作,其元素指示该结果序列中对位元素在原序列中的位置。可以理解,第一排序向量的逆可以将第一ID顺序还原成初始ID顺序。相应地,可以根据第一ID顺序到初始ID顺序的变化确定第一排序向量的逆。
在一些实施例中,当初始顺序的所述多个ID(构成初始ID序列)分别为其所对应的元素位置的标识(如行号)时,排序向量的逆可以等于基于该排序向量对初始ID序列进行排序得到的新的ID序列。
可以理解,关于第一排序向量的生成可以参考第二排序向量的生成。
步骤1130,以第一排序向量的逆为排序向量,对所述待重排的分组标记列进行排序,得到第一分组标记列。
由于第一排序向量可以将第一ID顺序还原成初始ID顺序,因此,以第一排序向量的逆为排序向量对对应第一ID顺序的所述待重排的分组标记列进行排序,可以得到对应初始ID顺序的第一分组标记列。
下面结合图12对流程1100进行示例。
如图12所示,第一方(A方)拥有数据列k1和k2(图12左上方表格)。数值列k2按大小升序排列,英文字母列k1按字典升序排列,排序键的优先级关系为k1>k2,可以得到图12右上方表格所示的结果序列。当初始顺序的10个ID分别为对应行的编号时,即初始ID顺序为(0,1,2,3,4,5,6,7,8,9)时,第一排序向量的逆就等于基于第一排序向量PA转换初始ID顺序得到的第一ID顺序(0,1,2,7,4,3,5,6,8,9)。基于对应第一ID顺序(0,1,2,7,4,3,5,6,8,9)的第一结果序列,可以得到对应第一ID顺序(0,1,2,7,4,3,5,6,8,9)的第一分组标记列g(即所述待重排的分组标记列)。基于第一排序向量的逆对对应第一ID顺序(0,1,2,7,4,3,5,6,8,9)的分组标记列g进行排序,可以得到对应初始ID顺序(0,1,2,3,4,5,6,7,8,9)的第一分组标记列G(即第一分组标记列)。
图13是根据本说明书一些实施例所示的通过合并排序向量获得第二排序向量示例性流程图。流程1300可以包括以下步骤:
步骤1310,对多个第二数据列之一进行基数排序,得到单列排序向量。
关于基数排序及其排序向量的相关说明可以在步骤140以及步骤240的相关说明中找到,在此不再赘述。所述单列排序向量(记为p0)可以用于标识根据该第二数据列(记为d0)对等长序列(如对d0本身)进行排序的操作。该等长序列对应所述目标ID集且元素顺序对应所述初始ID顺序,所述单列排序向量作用于该等长序列后,得到对应第一ID顺序的结果序列。也就是说,根据第一排序向量可以将初始ID顺序转换成第一ID顺序。所述单列排序向量的元素可以指示该等长序列中对位元素在结果序列中的位置。
步骤1320,进行一轮或多轮的单方合并,得到第二排序向量。
当仅有两个第二信息项作为排序键时,单方合并的轮次为一轮。当有超过两个第二信息项作为排序键时,单方合并的轮次为多轮(至少两轮)。
其中,一轮单方合并可以包括步骤1322至步骤1328。
步骤1322,获取当前轮的输入排序向量作为参与本轮合并的一个排序向量。
当当前轮为第一轮单方合并时,当前轮的输入排序向量为所述单列排序向量,否则,为前一轮的输出排序向量。为了方便描述,将第i轮单方合并的输入排序向量记为ci-1,将第i轮的输出排序向量记为ci,其中,i为小于或等于(N-1)的正整数,N为作为排序键的第二信息项的数量,相应地,多个第二信息项/数据列即N个第二信息项/数据列。当i=1时, c0=p0;当2≤i≤N-1时,第i轮的输入排序向量(ci-1)为第i-1轮的输出排序向量(ci-1)。
步骤1324,根据所述输入排序向量对所述多个第二数据列中的其他某一第二数据列进行排序,得到中间数据列。
所述N个第二数据列中:一个第二数据列用于生成所述单列排序向量,即参与合并的第一个排序向量;其他每一第二数据列参与一轮单方合并中另一排序向量的生成(参见步骤1326),因而总共需要N-1轮单方合并。为了方便描述,将第i轮中的其他某一第二数据列记为di,将第i轮中的另一排序向量(参见步骤1326)记为pi。
第二排序向量用于标识将N个第二信息项分别作为排序键对等长序列进行多键排序的操作,相应地,第二排序向量可由N个排序向量合并得到。每一轮参与合并的两个排序向量中,步骤1322提供的排序向量用于标识在先的排序操作,步骤1324提供的排序向量用于标识在后的排序操作,在后的排序操作作用于先排序操作的结果序列,如作用于所述中间数据列,因此可以确定所述中间数据列以生成用于标识在后排序操作的排序向量。
步骤1326,对所述中间数据列进行基数排序,得到参与本轮合并的另一排序向量。
第i轮的中间数据列可记为ci-1(di)。参考前文有关基数排序及其排序向量的介绍,基于中间数据列ci-1(di)可以确定用于标识对其进行基数排序操作的排序向量pi。
步骤1328,合并参与本轮合并的两个排序向量,得到当前轮的输出排序向量。
关于排序向量的合并可以在说明书中其他部分找到详细说明,在此不再赘述。第i轮的输出排序向量可以记为compose(ci-1,pi)。可以理解,最后一轮的输出排序向量为第二排序向量。
在一些实施例中,作为排序键的多个信息项具有人为设定的优先级,此时,优先级最低的信息项对应的数据列作为所述数据列d0,对于其他第二信息项,优先级越低的第二信息项对应的第二数据列在越靠前的轮次中作为所述其他某一第二数据列di。
对于一些依赖于排序的聚合运算,如求最大值、求最小值、求中位数,待排序数据列对应的信息项可以作为优先级最低的排序键,因此,可以将待排序数据列视为第二数据列,其对应的信息项视为优先级最低的第二信息项进行上述单方合并,且在迭代合并中,最先使用的排序键为待聚合列对应的第二信息项v。即,在步骤1310中可以针对待聚合列v生成单列排序向量p0。
关于合并排序向量的更多细节,可以参考前文的相关实施例以及图14的示例。
下面结合图14对流程1300进行示例。
如图14所示,第二方拥有第二数据列k3和待聚合列v,排序键v的优先级低于排序键k3。第二方可以通过一轮单方合并得到第二排序向量。具体地,第二方可以首先基于待聚合列v(即前文d0)生成单列排序向量作为参与合并的一个排序向量p0,以及基于单列排序向量p0对第二数据列k3进行排序,得到新的第二数据列k3(对应新的ID顺序,即所述中间数据列)。对新的第二数据列k3进行基数排序,第二方可以生成参与合并的另一排序向量p1。如此,第二方可以合并两个排序向量p0、p1得到第三排序向量PA',即PA'=compose(p0,p1)。
应当注意的是,上述有关流程的描述仅仅是为了示例和说明,而不限定本说明书的适用范围。对于本领域技术人员来说,在本说明书的指导下可以对流程进行各种修正和改变。然而,这些修正和改变仍在本说明书的范围之内。
图15是根据本说明书一些实施例所示的基于秘密分享的多键排序系统的示例性模块图。其中,第一方拥有一个或多个第一信息项对应的第一数据列,第二方拥有一个或多个第二信息项分别对应的第二数据列。第一数据列和第二数据列可以是ID对齐的。
系统1500可以在第一方实现。如图15所示,系统1500可以包括第一结果序列获得模块1510、第一分组标记列获得模块1520、第一秘密分享向量排序模块1530、第一秘密分享基数排序模块1540、第一秘密分享合并模块1550和第一多键排序模块1560。
第一结果序列获得模块1510可以用于将所述一个或多个第一信息项分别作为排序键对所述一个或多个第一数据列进行迭代排序,得到第一结果序列。
第一分组标记列获得模块1520可以用于基于第一结果序列获得第一分组标记列。
第一秘密分享向量排序模块1530可以用于将第一分组标记列作为待排序序列,与第二方将第二排序向量作为排序向量,进行秘密分享向量排序,得到经过排序的第一分组标记列的第一分片。
第一秘密分享基数排序模块1540可以用于基于所述经过排序的第一分组标记列的第一分片,与第二方基于所述经过排序的第一分组标记列的第二分片,进行秘密分享基数排序,得到第三排序向量的第一分片。
第一秘密分享合并模块1550可以用于基于第三排序向量的第一分片,与第二方基于第三排序向量的第二分片以及第二排序向量,进行秘密分享合并,得到多方排序向量的第一分片。
第一多键排序模块1560可以用于基于多方排序向量的第一分片,与第二方基于多方排序向量的第二分片,对待排序数据列进行秘密分享向量排序,得到目标数据列的第一分片。
图16是根据本说明书一些实施例所示的基于秘密分享的多键排序系统的示例性模块图。其中,第一方拥有一个或多个第一信息项对应的第一数据列,第二方拥有一个或多个第二信息项分别对应的第二数据列。第一数据列和第二数据列可以是ID对齐的。
系统1600可以在第二方实现。如图16所示,系统1600可以包括第二排序向量生成模块1610、第二秘密分享向量排序模块1630、第二秘密分享基数排序模块1640、第二秘密分享合并模块1650和第二多键排序模块1660。
第二排序向量生成模块1610可以用于基于所述一个或多个第二数据列生成第二排序向量。
第二秘密分享向量排序模块1630可以用于将第二排序向量作为排序向量,与第一方将第一分组标记列作为待排序序列,进行秘密分享向量排序,得到经过排序的第一分组标记列的第二分片。
第二秘密分享基数排序模块1640可以用于基于所述经过排序的第一分组标记列的第二分片,与第一方基于所述经过排序的第一分组标记列的第二分片,进行秘密分享基数排序,得到第三排序向量的第二分片。
第二秘密分享合并模块1650可以用于基于第三排序向量的第二分片,与第一方基于第三排序向量的第一分片以及第二排序向量,进行秘密分享合并,得到多方排序向量的第二分片。
第二多键排序模块1660可以用于基于多方排序向量的第二分片,与第二方基于多方排序向量的第二分片,对待排序数据列进行秘密分享向量排序,得到目标数据列的第二分片。
关于系统1500、系统1600及其模块的更多细节,可以参考图5及其相关描述。
应当理解,图15、图16所示的系统及其模块可以利用各种方式来实现。例如,在一些实施例中,系统及其模块可以通过硬件、软件或者软件和硬件的结合来实现。其中,硬件部分可以利用专用逻辑来实现;软件部分则可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。本领域技术人员可以理解上述的方法和系统可以使用计算机可执行指令和/或包含在处理器控制代码中来实现,例如在诸如磁盘、CD或DVD-ROM的载体介质、诸如只读存储器(固件)的可编程的存储器或者诸如光学或电子信号载体的数据载体上提供了这样的代码。本说明书的系统及其模块不仅可以有诸如超大规模集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路实现,也可以用例如由各种类型的处理器所执行的软件实现,还可以由上述硬件电路和软件的结合(例如,固件)来实现。
需要注意的是,以上对于系统及其模块的描述,仅为描述方便,并不能把本说明书限制在所举实施例范围之内。可以理解,对于本领域的技术人员来说,在了解系统的原理后,可能在不背离这一原理的情况下,对各个模块进行任意组合,或者构成子系统与其他模块连接。例如,在一些实施例中,第一结果序列获得模块1510和第一分组标记列获得模块1520可以是两个分立模块,也可以合并为一个模块。又如,第一(第二)秘密分享向量排序模块和第一(第二)多键排序模块可以是两个分立的模块(都调用密文向量排序算子),也可以合并成一个模块。诸如此类的变形,均在本说明书的保护范围之内。
本说明书实施例可能带来的有益效果包括但不限于:(1)提供一种基于秘密分享的多键排序方法,通过秘密分享方式实现多键排序,可以保护各方数据隐私;(2)按列排序,无需考虑列内部的分组情况,适用于基于秘密分享的多键排序。需要说明的是,不同实施例可能产生的有益效果不同,在不同的实施例里,可能产生的有益效果可以是以上任意一种或几种的组合,也可以是其他任何可能获得的有益效果。
上文已对基本概念做了描述,显然,对于本领域技术人员来说,上述详细披露仅仅作为示例,而并不构成对本说明书实施例的限定。虽然此处并没有明确说明,本领域技术人员可能会对本说明书实施例进行各种修改、改进和修正。该类修改、改进和修正在本说明书实施例中被建议,所以该类修改、改进、修正仍属于本说明书示范实施例的精神和范围。
同时,本说明书使用了特定词语来描述本说明书的实施例。如“一个实施例”、“一实施例”和/或“一些实施例”意指与本说明书至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一个替代性实施例”并不一定是指同一实施例。此外,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。
此外,本领域技术人员可以理解,本说明书实施例的各方面可以通过若干具有可专利性的种类或情况进行说明和描述,包括任何新的和有用的工序、机器、产品或物质的组合,或对他们的任何新的和有用的改进。相应地,本说明书实施例的各个方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。此外,本说明书实施例的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。
计算机存储介质可能包含一个内含有计算机程序编码的传播数据信号,例如在基带上或作为载波的一部分。该传播信号可能有多种表现形式,包括电磁形式、光形式等,或合适的组合形式。计算机存储介质可以是除计算机可读存储介质之外的任何计算机可读介质,该介质可以通过连接至一个指令执行系统、装置或设备以实现通讯、传播或传输供使用的程序。位于计算机存储介质上的程序编码可以通过任何合适的介质进行传播,包括无线电、电缆、光纤电缆、RF、或类似介质,或任何上述介质的组合。
本说明书实施例各部分操作所需的计算机程序编码可以用任意一种或多种程序语言编写,包括面向对象编程语言如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB.NET、Python等,常规程序化编程语言如C语言、VisualBasic、Fortran2003、Perl、COBOL2002、PHP、ABAP,动态编程语言如Python、Ruby和Groovy,或其他编程语言等。该程序编码可以完全在用户计算机上运行、或作为独立的软件包在用户计算机上运行、或部分在用户计算机上运行部分在远程计算机运行、或完全在远程计算机或处理设备上运行。在后种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或在云计算环境中,或作为服务使用如软件即服务(SaaS)。
此外,除非权利要求中明确说明,本说明书实施例所述处理元素和序列的顺序、数字字母的使用、或其他名称的使用,并非用于限定本说明书实施例流程和方法的顺序。尽管上述披露中通过各种示例讨论了一些目前认为有用的发明实施例,但应当理解的是,该类细节仅起到说明的目的,附加的权利要求并不仅限于披露的实施例,相反,权利要求旨在覆盖所有符合本说明书实施例实质和范围的修正和等价组合。例如,虽然以上所描述的系统组件可以通过硬件设备实现,但是也可以只通过软件的解决方案得以实现,如在现有的处理设备或移动设备上安装所描述的系统。
同理,应当注意的是,为了简化本说明书实施例披露的表述,从而帮助对一个或多个发明实施例的理解,前文对本说明书实施例的描述中,有时会将多种特征归并至一个实施例、附图或对其的描述中。但是,这种披露方法并不意味着本说明书实施例对象所需要的特征比权利要求中提及的特征多。实际上,实施例的特征要少于上述披露的单个实施例的全部特征。
针对本说明书引用的每个专利、专利申请、专利申请公开物和其他材料,如文章、书籍、说明书、出版物、文档等,特此将其全部内容并入本说明书作为参考。与本说明书内容不一致或产生冲突的申请历史文件除外,对本申请权利要求最广范围有限制的文件(当前或之后附加于本申请中的)也除外。需要说明的是,如果本说明书附属材料中的描述、定义和/或术语的使用与本说明书所述内容有不一致或冲突的地方,以本说明书的描述、定义和/或术语的使用为准。
最后,应当理解的是,本说明书中所述实施例仅用以说明本说明书实施例的原则。其他的变形也可能属于本说明书实施例的范围。因此,作为示例而非限制,本说明书实施例的替代配置可视为与本说明书的教导一致。相应地,本说明书的实施例不仅限于本说明书明确介绍和描述的实施例。