Page 262 - 《软件学报》2020年第11期
P. 262

侯瑞涛  等:分级可逆的关系数据水印方案                                                            3577


                    3.      table basic _i[k]=bit s ;
                    4.   else if (table basic _i[k] euqals bit s )
                    5.      continue(⋅);
                    6.   else if (table basic _i[k] !euqals bit s )
                    7.      put(hash em ,table overflow _i);
                    辅助数据存储时,采用哈希表为主的存储结构,且以数据分区为单位进行存储,各数据分区 i 均具有相应的
                 辅助数据存储结构 D s _i.D s _i 由两张表构成:一张基本表 table basic _i,一张溢出表 table overflow _i.其中,table basic _i 为
                 哈希表,用于存储大部分辅助数据;table overflow _i 为普通的关系数据表,用于存储发生哈希冲突且取值相反的辅
                 助数据对应的嵌入哈希值 hash em .根据函数 1,bit s 的具体存储过程:首先计算 bit s 在 table basic _i 中的存储位置 k,
                 其中,m 表示 table basic _i 的规模.如果 table basic_ i[k]为空,将 bit s 存入 table basic _i[k]即可;否则判断 table basic _i[k]与 bit s
                 是否相同.如果相同,不做处理,函数 1 运行完毕;如果不同,将 bit s 对应的 hash em 存入 table overflow _i,函数 1 运行完
                 毕.要注意的是,待所有的辅助数据存储完毕后,需为 table overflow _i 建立数据库索引,以提高 table overflow 的查询效
                 率.另外,table overflow _i 存储的是 hash em .相比于存储主键值本身的方式,其占用空间更少,而且对于具有非数值型
                 主键的数据,以及具有多字段组合主键的数据来说,可以采用统一的处理方式,其效率更高,更具实用性.
                    为降低辅助数据存储时的冲突率,进一步提高辅助数据的存取效率,本方案对辅助数据存储结构中基本表
                 的规模进行了实验分析.具体的实验细节见第 4.1 节.
                 2.4   数据质量等级检测
                    数据质量等级的检测是实现分级可逆水印的一个重要环节,其本质是检测嵌有水印的数据分区.水印检测
                 和数据质量等级提升都需要提前获知当前的数据质量等级,确定水印所在的数据分区.具体流程见算法 2.
                    算法 2.  等级检测算法.
                    Input: D s ,D w ,k,sk,S.

                    Output: Flag.
                    1.   for i=0 to γ−1 do
                    2.      totalcount_i=matchcount_i=0;
                    3.   for each tuple r∈D w  do
                    4.      hash part =H(r.key,k);
                    5.      i=hash part  mod γ;
                    6.      hash em =H(r.key,sk_i);
                    7.      if (hash em  mod η equals 0) {
                    8.         A_index x=hash em  mod ε;
                    9.         if (A_x is NULL)
                    10.           continue(⋅);
                    11.        bit_index y=hash em  mod ξ;
                    12.        WS_index z=hash em  mod ω;
                    13.        bit s =bit_y xor S_z;
                    14.        bit_temp=Get(r.key,D s _i);
                    15.        if (bit s  equals bit_temp)
                    16.           matchcount_i++;
                    17.        totalcount_i++;}
                    18.     else
                    19.       next tuple;
                    20. τ_i=threshold(totalcount_i,α);
   257   258   259   260   261   262   263   264   265   266   267