CN112527951B - 整数数据的存储方法、装置及存储介质 - Google Patents

整数数据的存储方法、装置及存储介质 Download PDF

Info

Publication number
CN112527951B
CN112527951B CN202110177676.8A CN202110177676A CN112527951B CN 112527951 B CN112527951 B CN 112527951B CN 202110177676 A CN202110177676 A CN 202110177676A CN 112527951 B CN112527951 B CN 112527951B
Authority
CN
China
Prior art keywords
byte
length
complementary
integer
integer data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110177676.8A
Other languages
English (en)
Other versions
CN112527951A (zh
Inventor
胡俊飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing ThreatBook Technology Co Ltd
Original Assignee
Beijing ThreatBook Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing ThreatBook Technology Co Ltd filed Critical Beijing ThreatBook Technology Co Ltd
Priority to CN202110177676.8A priority Critical patent/CN112527951B/zh
Publication of CN112527951A publication Critical patent/CN112527951A/zh
Application granted granted Critical
Publication of CN112527951B publication Critical patent/CN112527951B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/31Indexing; Data structures therefor; Storage structures

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

本申请公开了一种整数数据的存储方法、装置及存储介质,用于数据库中的整数数据存储。方法包括:接收输入到数据库的整数数据;将接收的整数数据转换为字节数组,在字节数组的第1个字节中,第1位表示整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,补字节长度结束之后的位数则为整数数据的最高几位,字节数组的长度等于第1个字节中的补字节长度加1,整数数据的绝对值由补值和差值相加组成;将转换为字节数组的整数数据存入数据库中。本申请既可以实现以变长字节数组存储整数数据,又可以实现直接基于字节数组来比较相同符号下的整数数据大小,且字节数组的字节长度不受限制。

Description

整数数据的存储方法、装置及存储介质
技术领域
本申请涉及数据存储领域,特别是涉及一种整数数据的存储方法、装置及存储介质。
背景技术
目前,NoSQL数据库中,如HBase、RocksDB、LevelDB等底层都是主要支持字节数组的数据格式,其他数据类型需要转换为字节数组再进行存储。对于整数,一般是按整数类型转换为固定长度的字节数组,比如整型(Integer)转换为4个字节的数组,而长整型(Long)转换为8个字节的数组。
转换为固定长度字节数组可以实现通过直接对字节数组的比较来比较整数的大小,不需要将值字节数组提前转换为整数。但是,很多时候由于不确定整数是否超过4个字节(即最大值4294967295),又需要直接比较的情况下,会统一采用长整型,即8个字节来存储整数,在整数值大部分比较小的情况下,会出现占用空间浪费的情况。
在一些数据库或者存储引擎中,通过将整数最低到高每7位编码到一个字节的后7位里,同时以该字节的首位是否置为1来区分该字节是否最后一个字节。这种编码方式既实现了变长字节存储,又实现了根据字节特征识别整数编码边界的作用,即根据字节最高位来判断字节数组中编码为某一个整数的字节长度,这种场景适用于将整数与其他值编码到一起的场景。但这种编码方式无法实现按字节数组直接对整数进行排序。
因此,亟待设计一种方案将整数数据转换为字节数组,使得根据字节数组首字节即可知道整数所占用的字节长度,并可以直接按字节数组对整数大小进行排序。
发明内容
基于变长编码、字节数组序排序、整数编码边界等多个需求进行分析,本发明设计了一种编码方式,该编码方式支持变长编码,最小长度只需要1个字节;支持字节数组序排序,根据对字节数组进行排序比较,即可实现对相同符号内所编码整数的比较;支持整数编码边界,根据字节数组首字节即可知道整数所占用的字节长度范围;支持基本编码方式和扩展编码方式,基本编码方式有最大值限制,而扩展编码方式则支持更多位数的整数。这种编码方式在一些常用场景下,尤其是大部分数值绝对值比较小的场景下,既能达到占用较小存储空间的目标,又能实现直接基于数组比较数值大小的功能。
第一方面,本申请设计了一种整数数据的存储方法,用于数据库中的整数数据存储,其特征在于:接收输入到数据库的整数数据;将接收的所述整数数据转换为字节数组,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,位值置1的位数,所述补字节长度结束之后的位数则为所述整数数据的最高几位,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节;将转换为字节数组的所述整数数据存入所述数据库中。
在一种可选的实施方式中,其进一步包括:当所述补字节长度超过7时,所述补字节长度编码所占的位数延续到所述字节数组的第1字节之后的字节中。
在一种可选的实施方式中,其进一步包括:所述将所有整数数据对应的字节长度由小到大进行排序表示相同符号下的整数数据的排序,所述符号包括非负整数和负整数。
在一种可选的实施方式中,其进一步包括:对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,以实现相同符号下的整数的有序比较。
第二方面,本申请设计了一种整数数据的存储装置,用于数据库中的整数数据存储,其特征在于:接收装置,其用于接收输入到数据库的整数数据;转换装置,其用于将接收的所述整数数据转换为字节数组,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,位值置1的位数,所述补字节长度结束之后的位数则为所述整数数据的最高几位,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节;存储装置,其用于将转换为字节数组的所述整数数据存入所述数据库中。
在一种可选的实施方式中,其进一步包括:当所述补字节长度超过7时,所述补字节长度编码所占的位数延续到所述字节数组的第1字节之后的字节中。
在一种可选的实施方式中,其进一步包括:所述将所有整数数据对应的字节长度由小到大进行排序表示相同符号下的整数数据的排序,所述符号包括非负整数和负整数。
在一种可选的实施方式中,其进一步包括:对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,以实现相同符号下的整数的有序比较。
第三方面,本申请设计了一种整数数据的存储装置,用于数据库中的整数数据存储,其特征在于:包括处理器和存储器;所述存储器存储计算机程序,所述处理器执行所述计算机程序以实现如本申请第一方面所述的方法。
第四方面,本申请设计了一种计算机存储介质,所述计算机存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如本申请第一方面所述的方法。
本发明通过对输入数据库的整数数据进行字节数组变长编码,通过字节数组的补字节长度就可以确认所述字节数组的字节长度,并通过所述字节数组直接就可以进行所述字节数组对应的整数数据之间的大小比较,以及字节数组的字节长度不受限制。
附图说明
在不一定按比例绘制的附图中,相同的附图标记可以在不同的视图中描述相似的部件。具有字母后缀或不同字母后缀的相同附图标记可以表示相似部件的不同实例。附图大体上通过举例而不是限制的方式示出各种实施例,并且与说明书以及权利要求书一起用于对所公开的实施例进行说明。在适当的时候,在所有附图中使用相同的附图标记指代同一或相似的部分。这样的实施例是例证性的,而并非旨在作为本装置或方法的穷尽或排他实施例。
图1示出了根据本发明的基于字节数组的整数变长有序编码的方法的流程示意图;
图2示出了根据本发明的基于字节数组的整数变长有序编码的装置的结构示意图.
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
另外,为了更好的说明本发明,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本发明同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本发明的主旨。
请参考图1,其示出了根据本发明的基于字节数组的整数变长有序编码的方法的流程示意图。
在HBase、RocksDB、LevelDB等KV数据库中,值是以字节数组的形式来存储的。存储整数时,一般根据是否整型或长整型而将值存储在4或8个字节中,考虑到4字节整型最大值的限制,同时又考虑到字节顺序比较的需要,一般采用8个字节存储整数。但如果大部分整数是比较小的整数,则占用多余的存储空间比较大。
本发明的编码方法对整数进行变长编码,绝对值数值越小的整数则编码长度越短,整数最小长度为1个字节;编码长度自解释,解码时即可知道编码占用的字节长度;同时能实现编码后字节数组顺序即表示相同符号下整数大小顺序。该编码方式借鉴哈夫曼编码的思路,对整数的位长度进行编码,保证不同整数长度与字节大小的一致性。
S101,接收输入到数据库的整数数据。其中数据库包括NoSQL数据库,如HBsae、RocksDB、LevelDB等KV数据库,在这些数据库中,数值是以字节数组的形式来存储的。
S102,将接收的整数数据转换为字节数组。
其中字节数组的每个字节包括8比特位,即第1-8位,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,位值置1的位数,所述补字节长度结束之后的位数则为所述整数数据的最高几位,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节。
其中,整数数据的字节数组编码方式包括两种方式,基本编码方式和扩展编码方式,在基本编码方式中,其字节数组的字节长度最长为8字节。
例如,整数7编码为1个字节的字节数组,该字节的第1位为1,表示其为非负整数,其中数值0编码为字节数组时也作为非负整数来设置,负整数则其第1字节的第1位为0,表示其为负整数,整数7对应的补字节位为第2位,第2位为0,为补字节长度结束的位置,从所述补字节占用的最高位开始到结束的位置,比特位值置1的位个数为0位,所以整数7对应的补字节长度为0,加上1即为该整数对应的字节数组长度1,也即整数7所对应的字节数组的长度为1位,由于1位字节长度不存在比其更小的字节长度,也就不存在补值,整数7所对应的数值直接由上述第1字节的第3至8位表示,第3至8位分别为0、0、0、1、1、1。
而整数100编码为2个字节的字节数组,第1字节的第1位为1,表示为非负整数,第2至3位分别为1、0,从所述补字节占用的最高位开始到结束的位置也即比特位置0的第3位,比特位值置1的位个数为1位,所以整数100对应的补字节长度为1,补字节长度加上1就为其对应的字节长度2,其补值为上一个字节长度也就是1个字节长度表达的最大值加1,1个字节长度所表达的最大值是63,加上1就是64,第1字节的后四位和第2字节组成整数的差值36,差值36加上补值64即获得该字节数组所表达的整数数据的绝对值100,也即第1字节的第4至8位分别为0、0、0、0,第2字节的第1至8位为0、0、1、0、0、1、0、0,其他字节数依次类推,不再赘述。
当整数数据对应的字节数组的补字节长度为7位时,其第1字节的第1位为1或0,表示该整数数据为非负整数或负整数,第2至8位为1、1、1、1、1、1、1,第8位即为补字节结束的位置,无需以比特位置0为结束位置,也即在此种情况下,所有字节数组的最大字节长度为8位。
在扩展编码方式中,字节数组的字节长度可以超过8字节,并且最大字节长度不受限制。其中当补字节长度超过7时,补字节长度编码所占的位数可以延续到后续的字节中,即补字节长度编码的比特位从开始位置一直顺序统计到位数值置0的比特位作为结束位置,该补字节长度所占的比特位数可以跨字节应用,也即该补字节长度所占的比特位数将延续到该字节数组的第1字节之后的字节中。而补字节长度超过7的整数数字的最高位则为上述结束位置后的下一比特位。
对于字节数组的长度,整数数据的绝对值数值越小,则所述整数数据转换后的字节数组的长度越短。
为实现相同符号下的有序比较和查询,所述符号包括非负整数数据和负整数数据,将所有整数数据对应的字节长度由小到大进行排序通常表示相同符号下的整数数据的排序,对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,从而实现相同符号下的整数的有序比较。其中绝对值大小相同的负整数和非负整数所对应的字节长度相同,所对应的补值和差值也相同,两者仅是第1字节的第1位不同。
S103,将转换为字节数组的所述整数数据存入所述数据库中。
本发明基于字节数组的整数变长有序编码的具体编码规则包括两种编码模式,即基本模式和扩展模式。
一、基本模式编码规则如下:
1)字节数组的第1个字节包含三部分:第1位表示正负;之后的位数用来编码补字节长度,编码规则本身带有长度界限;补字节长度编码位余下的位数表示整数值最高几位。第三部分的位数最小有可能是零,即该字节中没有整数值的表示部分。
2)整数编码字节数组的长度根据第1个字节中补字节长度来决定,即字节数组长度等于补字节长度加1。
3)补字节长度的编码方式为:位数从补字节长度占用的最高位开始计算,出现位数值置0的时候,即为补字节长度结束的位置,该位置之后的位数即为整数值的表示部分。补字节长度则为补字节长度编码值从开始直到结束位时,比特位值置1的位个数,比如补字节长度编码部分的比特位为11110,则补字节长度为4。
4)整数值的绝对值由补值和差值相加组成。字节数组除第1个字节外,后续的字节与第1个字节中整数值的表示部分一起组成整数值的差值;补值则根据补字节长度来决定。
5)以总字节长度由小到大的顺序,每一个字节长度的补值为上一个字节长度所能表达的最大值加1;而当前字节长度所能表达的最大值为补值加上当前字节数组中数据部分所能表达的整数最大值(即差值的最大值)。
6)零值的符号位以正整数的符号规则来编码,其余相同。
编码算法伪代码如下:
public static byte[] encodeVarOrderedBytes(long val) {
if (val == Long.MAX_VALUE || val == Long.MIN_VALUE) {
throw new IllegalArgumentException("unsupported number range");
}
byte[] b;
boolean negative = (val < 0);
long value = (val < 0
Figure 973538DEST_PATH_IMAGE001
(-val) : val);
int length = 0;
if (value < (1L << 6)) {
length = 1;
} else if (value < ((1L << (8 + 5)) + (1L << 6))) {
length = 2;
} else if (value < ((1L << (2 * 8 + 4)) + (1L << (8 + 5)) + (1L <<6))) {
length = 3;
} else if (value < ((1L << (3 * 8 + 3)) + (1L << (2 * 8 + 4)) + (1L << (8 + 5)) + (1L << 6))){
length = 4;
} else if (value < ((1L << (4 * 8 + 2)) + (1L << (3 * 8 + 3)) + (1L << (2 * 8 + 4)) + (1L <<
(8 + 5)) + (1L << 6))) {
length = 5;
} else if (value < ((1L << (5 * 8 + 1)) + (1L << (4 * 8 + 2)) + (1L << (3 * 8 + 3)) + (1L <<
(2 * 8 + 4)) + (1L << (8 + 5)) + (1L << 6))) {
length = 6;
} else if (value < ((1L << (6 * 8)) + (1L << (5 * 8 + 1)) + (1L << (4* 8 + 2)) + (1L << (3 * 8 + 3)) + (1L << (2 * 8 + 4)) + (1L << (8 + 5)) + (1L<< 6))) {
length = 7;
} else if (value < ((1L << (7 * 8)) + (1L << (6 * 8)) + (1L << (5 * 8+ 1)) + (1L << (4 * 8 + 2)) + (1L << (3 * 8 + 3)) + (1L << (2 * 8 + 4)) + (1L<< (8 + 5)) + (1L << 6))) {
length = 8;
} else {
throw new IllegalArgumentException("unsupported number range");
}
b = new byte[length];
long v = value;
byte bl = 0;
for (int i = 0; i < length - 1; i++) {
bl |= (1 << (6 - i));
v = v - (1L << (i * 8 + (6 - i)));
}
b[0] = (byte) (bl | (v >> ((length - 1) * 8)));
for (int i = 1; i < length; i++) {
b[i] = (byte) (v >> ((length - i - 1) * 8));
}
if (!negative) {
b[0] = (byte) (b[0] | 0x80);
}
return b;
}
解码算法伪代码如下:
public static long decodeVarOrderedBytes(byte[] val) {
boolean negative = (((b[offset] >> 7) & 0x01) == 0);
byte bl = (byte) (b[offset] & 0x7f);
int idx = 6;
while (idx >= 0 && ((bl >> idx) & 1) == 1) {
idx--;
}
int addLen = (idx < 0
Figure 952995DEST_PATH_IMAGE001
7 : (6 - idx));
int voff = (6 - addLen);
int mask = (Math.max(voff, 0));
switch (addLen) {
case 0: {
v = (long) b[offset] & 0x3f;
break;
}
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: {
v = (((long) b[offset] & ((1 << mask) - 1)) << (addLen * 8));
for (int i = 0; i < addLen; i++) {
v += ((long) (b[offset + i + 1] & 0xff) << ((addLen - 1 - i) * 8)) +(1L << (i * 8 + (6 - i)));
}
break;
}
default: {
throw new IllegalArgumentException("unsupported number range");
}
}
return negative
Figure 155568DEST_PATH_IMAGE001
-v : v;
}
二、扩展模式编码规则如下:
1)字节数组的第1个字节与基本模式一样,仍然包含符号位、补字节长度编码位、整数表示位三个部分。但当补字节长度超过7时,补字节长度编码规则依次递延至之后的字节,即补字节长度编码的比特位从开始位置一直顺序统计到位数值置0的位置,并可跨字节应用该规则。
2)其余规则同基本模式编码规则。
扩展模式算法实现与基本模式类似,只在处理补字节长度编码时有一些不同,算法省略。
设v为整数值,L为编码之后的字节数组长度,C为补字节数组长度。由编码规则可知:L=C+1。
针对某字节数组长度区间,V表示数值大小,CV表示补值大小,DV表示差值大小,MAXV和MINV表示该区间所能表示整数的最大值和最小值,MAXCV和MINCV表示补值的最大值和最小值,MAXDV和MINDV表示差值的最大值和最小值,R为区间的值域。
证明过程如下:
一、在非负数整数情况下,证明唯一性和有序性。
1、表示唯一性,即证明唯一一个非负整数值与唯一一个字节数组相对应,包含如下两部分:
a. 证明任意不同的字节数组表示的非负整数值不同且唯一,证明如下:
1)若Lm和Ln相邻,即Ln = Lm + 1,则根据规则,MINVn = MAXVm + 1,即整数值域区间Rm与Rn连续无重合。
2)若Lm和Ln不相邻,则可以找出Lm和Ln之间的连续区间,即L(m+1)、L(m+2)、L(m+3)…L(n-1),从而组成连续的值域空间,证明整数值域区间Rm和Rn无重合。
3)由以上两条可知,不同长度的字节数组表示了不同区间的整数值,而由规则可知不同长度的字节数组其首位字节必然不同。
4)由于区间内的任意一个值V=CV+DV。区间内CV相同,而字节数组的数值部分如果不同,则DV不同,从而导致V不同。即任一表示非负整数的字节数组只能表示为唯一一个正整数。
b. 证明任意不同的非负整数值所编码的字节数组不同,证明如下:
1)根据编码规则和算法,任意一个非负整数值V,其编码的字节数组长度由其值所在的区间来决定,即一个正整数值V不会同时编码为不同长度的字节数组中去。
2)根据V=CV+DV,且区间内CV值相同。即任意一个非负整数值V,其DV值唯一,所以只能编码为唯一的字节数组中的数值部分。
3)结合以上两条,即任意一个非负整数只对应唯一的一个字节数组。
2、有序性,即证明字节序大小代表整数值大小。设字节数组Bj由值j转换而成,Bi由值i转换而成,字节序上Bj>Bi,在首字节首位相同的情况下,证明如下:
1)若字节数组的首字节不同,根据补字节数组长度C的编码规则,C越大,则首字节从第2位开始连续的1越多,根据字节比较规则,则字节值越大。即字节值补字节数组长度C编码部分越大,即代表C越大。设Bj属于长度n,Bi属于长度m。由于字节数组长度的大小与区间值的递增顺序一致,即若n>m,则值域Rn全部大于Rm。由此得证,j > i。
2)若从首字节第2位开始,补字节数组长度C编码部分相同,则由编码规则得知,字节数组的数值部分的位值是不同的。设两者的位值为BVj和BVi,即BVj大于BVi,则值的大小顺序与编码字节中整数表示部分的字节序列相同,即j > i。
二、以上证明都是以非负数为前提进行,需要证明负数与非负数的数组区间不交叉,同时负数的区间仍然满足以上唯一性和有序性。
1、无交叉性,证明如下:
因负数与非负数的首字节首位不同,即负数与非负数的区间不会存在交叉。特别的是,规定零值以正符号编码,即零值与负数不交叉。
2、唯一性,证明如下:
1)对任一负数V,根据之前的证明,其绝对值-V都由唯一的一个字节数组表示,且首字节首位为1。则对V,都由唯一的一个字节数组表示,除了将首字节首位置为0外,其字节数组值与-V的字节数组值相同。
2)对任一字节数组,若其首字节首位为1,则根据之前的证明,其表示唯一的非负整数值V。若其首字节首位为0,则将其首字节首位置为1时表示的唯一值设为V,原始字节数组表示的唯一负整数值为-V。
3、有序性,设字节数组Bj由值j转换而成,Bi由值i转换而成,字节序上Bj > Bi,且i和j都为负整数。证明如下:
1)由于首字节首位相同,将首字节首位置为1时,值分别为-i和-j。
2)若Bj > Bi,则-j > -i,即i > j。由此得知,在两个值都是负整数时,满足字节数组的逆序性,即字节数组的字节序越大,则负整数值越小。
根据编码规则可知,绝对值越小的数值,字节数组长度越小,且根据首字节即可判断所表示整数的字节数组长度边界;根据以上证明结果,该编码方式可以实现相同符号情况下的整数值大小与编码字节序的一致性(非负整数时为顺序,负整数时为逆序),可以实现相同符号下的有序范围比较和查询。
这种编码方式的缺点是针对不同符号下的整数,其有序性不同。此种情况下的一个解决方案是,可以分为非负整数比较部分和负整数比较部分,分两次进行有序比较,仍然可以在一定程度上减少比较顺序和存储顺序不一致带来的性能损失。
这种编码的基本模式适用于绝对值不超过72341285353037887的情况,实现起来相对简单。扩展模式实现上比基本模式复杂一些,需要处理补字节长度编码,但因为补字节长度不受限制,可以表示超过基本模式限制的整数值,甚至表示超过64位长整型的数值。因此可以根据不同场景采取不同的处理模式。
图2示出了根据本发明的基于字节数组的整数变长有序编码的装置的结构示意图,该装置用于数据库中的整数数据存储。
接收装置201,用于接收输入到数据库的整数数据。其中数据库包括NoSQL数据库,如HBsae、RocksDB、LevelDB等KV数据库,在这些数据库中,数值是以字节数组的形式来存储的。
转换装置202,用于将接收的整数数据转换为字节数组。
其中字节数组的每个字节包括8比特位,即第1-8位,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,位值置1的位数,所述补字节长度结束之后的位数则为所述整数数据的最高几位,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节。
其中,整数数据的字节数组编码方式包括两种方式,基本编码方式和扩展编码方式,在基本编码方式中,其字节数组的字节长度最长为8字节。
在扩展编码方式中,字节数组的字节长度可以超过8字节,并且最大字节长度不受限制。其中当补字节长度超过7时,补字节长度编码所占的位数可以延续到后续的字节中,即补字节长度编码的比特位从开始位置一直顺序统计到位数值置0的比特位作为结束位置,该补字节长度所占的比特位数可以跨字节应用,也即该补字节长度所占的比特位数将延续到该字节数组的第1字节之后的字节中。而补字节长度超过7的整数数字的最高位则为上述结束位置后的下一比特位。
对于字节数组的长度,整数数据的绝对值数值越小,则所述整数数据转换后的字节数组的长度越短。
为实现相同符号下的有序比较和查询,所述符号包括非负整数数据和负整数数据,将所有整数数据对应的字节长度由小到大进行排序通常表示相同符号下的整数大小顺序,对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,从而实现相同符号下的整数的有序比较。其中绝对值大小相同的负整数和非负整数所对应的字节长度相同,所对应的补值和差值也相同,两者仅是第1字节的第1位不同。
存储装置203,用于将转换为字节数组的所述整数数据存入所述数据库中。
应当理解,上述示例的基于字节数组的整数变长有序编码的装置的结构仅为本发明实施例提供的一个例子,其可具有比示出的部件更多或更少的部件,可以组合两个或更多个部件,或者可具有部件的不同配置实现。如在数据库中,包括处理器和存储器,所述存储器存储计算机程序,所述处理器执行所述计算机程序以实现本发明所述的基于字节数组的整数变长有序编码的方法。
结合本发明实施例公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(英文:Random Access Memory,RAM)、闪存、只读存储器(英文:Read Only Memory,ROM)、可擦除可编程只读存储器(英文:ErasableProgrammable ROM,EPROM)、电可擦可编程只读存储器(英文:Electrically EPROM,EEPROM)、寄存器、硬盘、移动硬盘、只读光盘(CD-ROM)或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。
以上对本发明的实施例进行了描述。但是这些实施例仅仅是为了说明的目的,而并非为了限制本发明的范围。本发明的范围由所附权利要求及其等价物限定。不脱离本发明的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本发明公开的范围之内。

Claims (10)

1.一种整数数据的存储方法,用于数据库中的整数数据存储,其特征在于,所述整数数据的存储方法包括如下步骤:
接收输入到数据库的整数数据;
将接收的所述整数数据转换为字节数组,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,当出现位数值置1的位数时,所述补字节长度结束之后的位数则为所述整数数据的最高几位的位数,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节;
将转换为字节数组的所述整数数据存入所述数据库中。
2.一种如权利要求1所述的方法,其特征在于:当所述补字节长度超过7时,所述补字节长度编码所占的位数延续到所述字节数组第1字节之后的字节中。
3.一种如权利要求1所述的方法,其特征在于:所述将所有整数数据对应的字节长度由小到大进行排序表示相同符号下的整数数据的排序,所述符号包括非负整数和负整数。
4.一种如权利要求3所述的方法,其特征在于:对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,以实现相同符号下的整数的有序比较。
5.一种整数数据的存储装置,用于数据库中的整数数据存储,其特征在于,所述整数数据的存储装置包括:
接收装置,其用于接收输入到数据库的整数数据;
转换装置,其用于将接收的所述整数数据转换为字节数组,在所述字节数组的第1个字节中,第1位表示所述整数数据属于非负整数或负整数,之后的位数用来编码补字节长度,所述补字节长度的编码方式为:位数从所述补字节占用的最高位开始计算,当出现位数值置0时,则为补字节长度结束的位置,其中所述补字节长度为从所述补字节占用的最高位开始到结束的位置,当出现位数值置1的位数时,所述补字节长度结束之后的位数则为所述整数数据的最高几位的位数,所述字节数组的长度等于所述第1个字节中的补字节长度加1,所述整数数据的绝对值由补值和差值相加组成,所述字节数组除第1个字节外,后续的字节与所述第1个字节中表示整数数据的最高几位一起组成所述整数的差值,所述补值根据所述补字节长度来决定,其中将所有整数数据对应的字节长度由小到大进行排序,每个字节长度的补值为上一个字节长度所表达的最大值加1,其中最短字节数组的长度为1个字节;
存储装置,其用于将转换为字节数组的所述整数数据存入所述数据库中。
6.一种如权利要求5所述的装置,其特征在于:当所述补字节长度超过7时,所述补字节长度编码所占的位数延续到所述字节数组的第1字节之后的字节中。
7.一种如权利要求5所述的装置,其特征在于:所述将所有整数数据对应的字节长度由小到大进行排序表示相同符号下的整数数据的排序,所述符号包括非负整数和负整数。
8.一种如权利要求7所述的装置,其特征在于:对不同符号下的整数数据分开进行由小到大的排序,非负整数以顺序进行排序,负整数以逆序进行排序,以实现相同符号下的整数的有序比较。
9.一种整数数据的存储装置,用于数据库中的整数数据存储,其特征在于:
包括处理器和存储器;
所述存储器存储计算机程序,所述处理器执行所述计算机程序以实现如权利要求1-4任一所述的方法。
10.一种计算机存储介质,所述计算机存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至4任一所述的方法。
CN202110177676.8A 2021-02-09 2021-02-09 整数数据的存储方法、装置及存储介质 Active CN112527951B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110177676.8A CN112527951B (zh) 2021-02-09 2021-02-09 整数数据的存储方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110177676.8A CN112527951B (zh) 2021-02-09 2021-02-09 整数数据的存储方法、装置及存储介质

Publications (2)

Publication Number Publication Date
CN112527951A CN112527951A (zh) 2021-03-19
CN112527951B true CN112527951B (zh) 2021-05-11

Family

ID=74975532

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110177676.8A Active CN112527951B (zh) 2021-02-09 2021-02-09 整数数据的存储方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN112527951B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113644986B (zh) * 2021-08-25 2023-07-11 上海幻电信息科技有限公司 编码方法、编码装置、计算设备及计算机可读存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103514224B (zh) * 2012-06-29 2017-08-25 国际商业机器公司 数据库中的数据处理方法、数据查询方法和相应装置
CN107291832B (zh) * 2017-05-27 2020-02-18 华南理工大学 一种基于列表存储结构的数据存储方法
CN107291935B (zh) * 2017-07-04 2020-09-29 东北大学 基于Spark与Huffman编码的CPIR-V最近邻隐私保护查询方法
CN108616580B (zh) * 2018-04-10 2021-03-26 广州新科佳都科技有限公司 基于ice消息中间件的分布式系统及其数据传输方法

Also Published As

Publication number Publication date
CN112527951A (zh) 2021-03-19

Similar Documents

Publication Publication Date Title
KR100950607B1 (ko) 허프만 코딩
US3675211A (en) Data compaction using modified variable-length coding
US4044347A (en) Variable-length to fixed-length conversion of minimum-redundancy codes
US5181031A (en) Method and apparatus for decoding huffman codes by detecting a special class
US6646577B2 (en) Method of performing Huffman decoding
US20060087460A1 (en) Method of generating Huffman code length information
JP2002305450A (ja) 10進数を2進数にエンコード/デコードする方法
CN112527951B (zh) 整数数据的存储方法、装置及存储介质
JPS6356726B2 (zh)
CN114614833A (zh) 自适应游程编码的测试数据压缩及解压方法
CN114614832A (zh) 基于前后游程长度编码的测试数据压缩及解压方法
JPH03204234A (ja) 圧縮データ復元方法
JPH03204235A (ja) 圧縮データの復号方法
CN112699639B (zh) 整数数据的存储方法、装置及存储介质
EP1130926A2 (en) Variable length decoding system and method
JP2590287B2 (ja) データ圧縮方法およびデータ圧縮装置
JP3199292B2 (ja) ハフマン符号の符号化でのランレングス抽出方法、ハフマン符号変換方法およびmh符号化処理方法
JP3199291B2 (ja) ハフマン復号化テーブルの構成方法
CN115333544B (zh) 一种数据解压缩电路及其方法、芯片及电子设备
JP2003273746A (ja) 可変長符号復号装置
JP3038233B2 (ja) データ圧縮及び復元装置
JPH04280517A (ja) データ圧縮および復元方式
JPH05152973A (ja) 可変長符号復号器
JP3100206B2 (ja) データ圧縮方法
JP3038234B2 (ja) データ圧縮装置の辞書検索方式

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant