一种唯一哈希序号生成方法和系统与流程

文档序号:31862532发布日期:2022-10-19 06:10阅读:30来源:国知局
1.本发明涉及一种序号生成技术,具体涉及一种唯一哈希序号生成方法和系统。
背景技术
::2.在后台系统开发设计中,需要对字符串进行散列,或者在处理结构化数据时,需要以字符串作为索引来进行存储,以上场景都需要用到哈希函数对字符串进行散列,得到字符串的哈希值,哈希值格式为数字,以此作为索引号进行数据存储。3.哈希函数(英语:hash)又称作散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来,创建一个叫做“散列值”的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。4.但目前常用的哈希函数应用于此场景中,存在处理较慢、哈希值冲突、哈希值范围区间大的问题。技术实现要素:5.以下给出一个或多个方面的简要概述以提供对这些方面的基本理解。此概述不是所有构想到的方面的详尽综览,并且既非旨在指认出所有方面的关键性或决定性要素亦非试图界定任何或所有方面的范围。其唯一的目的是要以简化形式给出一个或多个方面的一些概念以为稍后给出的更加详细的描述之序。6.本发明的目的在于解决上述问题,提供了一种唯一哈希序号生成方法和系统,有效解决哈希值范围区间大的问题,提高以字符串为索引的对象在存储时的空间利用率和数据查询效率。7.本发明的技术方案为:本发明揭示了一种唯一哈希序号生成方法,方法包括新建唯一哈希序号的流程,新建流程包括:8.首先,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射为哈希值;9.以哈希值为索引,检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若不存在,则创建哈希项,把哈希序号赋值给新建的哈希项,并自增1,同时创建以该哈希项为头指针的哈希链表,将哈希链表保存在code_table对应的索引位置后,返回哈希序号;若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入的字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则在链表尾节点创建新的哈希项,更新哈希项的哈希序号和字符串值,哈希序号自增1,并返回新哈希项的哈希序号。10.根据本发明的唯一哈希序号生成方法的一实施例,方法还包括获取哈希序号的流程,获取流程包括:11.首先,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射哈希值;12.以哈希值为索引检查cblock_map类型的code_table中,检查索引对应位置是否存在有效值,若不存在有效值,则返回查询失败;若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则返回查询失败。13.根据本发明的唯一哈希序号生成方法的一实施例,cblock_map的数据缓存结构是根据索引快速读取缓存值,其中cblock_map的底层以二维指针数组形式对数据进行存储和管理,初始化时可定义行、列数值,但不进行内存申请,二维指针数组根据插入时索引位置按需初始化,每次初始化索引所在行的数组。14.根据本发明的唯一哈希序号生成方法的一实施例,cblock_map的底层存储组件进一步配置有初始化、数据保存和数据读取的流程,其中:15.cblock_map类型的code_table初始化流程进一步配置为:首先创建cblock_map类型的指针,构造方法中添加行数、页数的参数,cblock_map底层存储为二维指针数组形式,行数*页数的值规定code_table支持的最大索引数,在数组初始化时,统一将行数组设为空指针,并不进行额外的空间申请;16.cblock_map类型的code_table保存数据流程进一步配置为:首先根据传入哈希序号值,判断所要保存的数据应该位于哪个行数组内,若该行数组不存在,则新建并初始化行数组,再根据哈希序号对页数取余,得到具体的存储位置,把待存储数组更新至该存储位置;17.cblock_map类型的code_table读取数据流程进一步配置为:先根据传入哈希序号值,判断所要读取的数据应该位于哪个行数组内,若该行数组不存在,则返回读取失败;根据哈希序号对页数取余,得到具体的存储位置,判断存储位置是否为空,为空则返回查询失败,反之返回该索引处存储的值。18.本发明还揭示了一种唯一哈希序号生成系统,系统包括:新建唯一哈希序号的子系统,其中新建唯一哈希序号的子系统进一步包括:19.新建哈希序号的映射模块,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射为哈希值;20.新建哈希序号的第一分支模块,以哈希值为索引,检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若不存在有效值,则创建哈希项,把哈希序号赋值给新建的哈希项,并自增1,同时创建以该哈希项为头指针的哈希链表,将哈希链表保存在code_table对应的索引位置后,返回哈希序号;21.新建哈希序号的第二分支模块,以哈希值为索引,检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入的字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则在链表尾节点创建新的哈希项,更新哈希项的哈希序号和字符串值,哈希序号自增1,并返回新哈希项的哈希序号。22.根据本发明的唯一哈希序号生成系统的一实施例,系统包括:获取唯一哈希序号的子系统,其中获取唯一哈希序号的子系统进一步包括:23.获取哈希序号的映射模块,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射哈希值;24.获取哈希序号的第一分支模块,以哈希值为索引检查cblock_map类型的code_table中,检查索引对应位置是否存在有效值,若不存在有效值,则返回查询失败;25.获取哈希序号的第二分支模块,以哈希值为索引检查cblock_map类型的code_table中,检查索引对应位置是否存在有效值,若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则返回查询失败。26.根据本发明的唯一哈希序号生成系统的一实施例,cblock_map的数据缓存结构是根据索引快速读取缓存值,其中cblock_map的底层以二维指针数组形式对数据进行存储和管理,初始化时可定义行、列数值,但不进行内存申请,二维指针数组根据插入时索引位置按需初始化,每次初始化索引所在行的数组。27.根据本发明的唯一哈希序号生成系统的一实施例,系统还包括cblock_map的底层存储组件,cblock_map的底层存储组件进一步配置有初始化单元、数据保存单元和数据读取单元,其中:28.初始化单元,配置为先创建cblock_map类型的指针,构造方法中添加行数、页数的参数,cblock_map底层存储为二维指针数组形式,行数*页数的值规定code_table支持的最大索引数,在数组初始化时,统一将行数组设为空指针,并不进行额外的空间申请;29.数据保存单元,配置为先根据传入哈希序号值,判断所要保存的数据应该位于哪个行数组内,若该行数组不存在,则新建并初始化行数组,再根据哈希序号对页数取余,得到具体的存储位置,把待存储数组更新至该存储位置;30.数据读取单元,配置为先根据传入哈希序号值,判断所要读取的数据应该位于哪个行数组内,若该行数组不存在,则返回读取失败;根据哈希序号对页数取余,得到具体的存储位置,判断存储位置是否为空,为空则返回查询失败,反之返回该索引处存储的值。31.本发明对比现有技术有如下的有益效果:本发明的唯一哈希序号生成方法,对字符串进行处理,生成0开始的哈希序号,有效解决哈希值范围区间大的问题,在处理以字符串为索引的结构化数据存储时,将索引字符串转换成从0自增的数值,有效提高以字符串为索引的对象在存储时的空间利用率和数据查询效率。32.详细而言,本发明的特点在于:33.1.本发明的方法对字符串处理,生成从0自增的哈希序号,哈希序号可作为索引代替原先需要字符串作为索引的存储数据结构,大幅提高存储数据结构的数据存取能力,节省存储时使用的内存空间。34.2.本发明的方法使用cblock_map的数据缓存结构提供大空间的数据存储能力,cblock_map对哈希项存储时以哈希项的哈希值为索引,包含字符串和哈希序号等信息,索引范围支持0~max_int的数据大小。在方法的运行过程中cblock_map内存结构稳定,所有可能使用的空间在构造方法中已预先准备,不存在当空间占满后重新创建对象并拷贝数据的场景。35.3.本发明的方法使用cblock_map提供高效且稳定的读写能力,对哈希值的索引存储位置支持o(1)效率的查找,即便遇到哈希冲突的情况,也可以通过链表遍历的方式将查询时间控制在常量范围。附图说明36.在结合以下附图阅读本公开的实施例的详细描述之后,能够更好地理解本发明的上述特征和优点。在附图中,各组件不一定是按比例绘制,并且具有类似的相关特性或特征的组件可能具有相同或相近的附图标记。37.图1示出了本发明的新建哈希序号的流程图。38.图2示出了本发明的获取哈希序号的流程图。39.图3示出了本发明的底层存储cblock_map的初始化流程图。40.图4示出了本发明的底层存储cblock_map的set(保存)流程图。41.图5示出了本发明的底层存储cblock_map的get(读取)流程图。42.图6示出了本发明的唯一哈希序号生成系统的实施例的原理图。具体实施方式43.以下结合附图和具体实施例对本发明作详细描述。注意,以下结合附图和具体实施例描述的诸方面仅是示例性的,而不应被理解为对本发明的保护范围进行任何限制。44.本发明的唯一哈希序号生成方法的实施例的外部调用接口如图1和图2所示,分别是新建和获取的调用接口。45.如图1所示,新建唯一哈希序号的流程详述如下。46.首先,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射为long类型的哈希值value(哈希值value的取值范围为0~max_int)。47.以哈希值为索引,检查cblock_map类型的code_table(字符串哈希值映射表)中,索引对应位置是否存在有效值,若不存在,则创建哈希项,把哈希序号赋值给新建的哈希项,并自增1,同时创建以该哈希项为头指针的哈希链表,将哈希链表保存在code_table对应的索引位置后,返回哈希序号index;若索引对应位置在code_table中存在有效值,则该有效值为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入的字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则在链表尾节点创建新的哈希项,更新哈希项的哈希序号和字符串值,哈希序号自增1,并返回新哈希项的哈希序号。48.如图2所示,获取哈希序号的流程详述如下。49.首先,获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射为long类型的哈希值value(哈希值value的取值范围为0~max_int)。50.以哈希值为索引检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若不存在有效值,则返回查询失败;若索引对应位置在code_table中存在有效值,则该有效值为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则返回查询失败。51.作为方法实现的底层存储组件cblock_map的核心方法,包括了cblock_map的初始化、数据保存和数据读取的流程。52.cblock_map是一种数据缓存结构,根据索引快速读取缓存值。cblock_map的底层以二维指针数组形式对数据进行存储和管理,初始化时可定义行、列数值,但不进行内存申请。数组根据插入时索引位置按需初始化,每次初始化索引所在行的数组,防止占用内存过多,同时有效提高数据存储性能。53.图3描述了cblock_map类型的code_table初始化流程。如图3所示,首先创建cblock_map类型的指针,构造方法中可添加行数、页数的参数,cblock_map底层存储为二维指针数组形式,行数*页数的值规定了code_table支持的最大索引数。数组初始化时,统一将行数组设为空指针,并不进行额外的空间申请。54.图4描述了cblock_map类型的code_table保存数据流程。如图4所示,首先根据传入哈希序号index值,判断所要保存的数据应该位于哪个行数组内,若该行数组不存在,则新建并初始化行数组,再根据哈希序号index对页数取余,得到具体的存储位置,把待存储数组更新至该存储位置。55.图5描述了cblock_map类型的code_table读取数据流程。如图5所示,先根据传入哈希序号index值,判断所要读取的数据应该位于哪个行数组内,若该行数组不存在,则返回读取失败;根据哈希序号index对页数取余,得到具体的存储位置,判断存储位置是否为空,为空则返回查询失败,反之返回该索引处存储的值。56.如图3至5所示,本方法在哈希函数的基础上,增加cblock_map类型的code_table,对所有已处理字符串缓存,依赖cblock_map的快速存取能力,将散列后乱序的哈希值转换成从0自增的哈希序号,为调用方提供有序的字符串哈希值。在遇到哈希函数处理字符串时的哈希冲突问题时,采用链表的形式,依次完成字符串值对比,完全避免哈希冲突产生。考虑到哈希冲突的小概率性和链表的高效遍历特点,哈希冲突导致的算法处理抖动可忽略。57.在上述的实施例中,可做适当的扩展。例如cblock_map底层存储类可以被其他形式的类替换,底层存储可使用其他非二维指针数组的数据结构,只需要提供大范围哈希值的映射即可。上述实施例中对于哈希冲突的解决方式采用了链表地址法,可替换为其他形式如开放地址法、线性探测、再平方探测和建立公共溢出区等方式。上述方法的特征可概括为对字符串进行按序的数值转换,且具有高性能、零冲突的特性。58.图6示出了本发明的唯一哈希序号生成系统的实施例的原理。请参见图6,本实施例的系统包括:新建唯一哈希序号的子系统、获取唯一哈希序号的子系统、cblock_map的底层存储组件。59.新建唯一哈希序号的子系统包括新建哈希序号的映射模块、新建哈希序号的第一分支模块、新建哈希序号的第二分支模块。60.新建哈希序号的映射模块,配置为获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射为哈希值。61.新建哈希序号的第一分支模块,配置为以哈希值为索引,检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若不存在有效值,则创建哈希项,把哈希序号赋值给新建的哈希项,并自增1,同时创建以该哈希项为头指针的哈希链表,将哈希链表保存在code_table对应的索引位置后,返回哈希序号。62.新建哈希序号的第二分支模块,配置为以哈希值为索引,检查cblock_map类型的code_table中,索引对应位置是否存在有效值,若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入的字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则在链表尾节点创建新的哈希项,更新哈希项的哈希序号和字符串值,哈希序号自增1,并返回新哈希项的哈希序号。63.获取唯一哈希序号的子系统包括:获取哈希序号的映射模块、获取哈希序号的第一分支模块、获取哈希序号的第二分支模块。64.获取哈希序号的映射模块,配置为获取传入待取哈希序号的字符串,使用哈希函数按字符处理映射哈希值。65.获取哈希序号的第一分支模块,配置为以哈希值为索引检查cblock_map类型的code_table中,检查索引对应位置是否存在有效值,若不存在有效值,则返回查询失败。66.获取哈希序号的第二分支模块,配置为以哈希值为索引检查cblock_map类型的code_table中,检查索引对应位置是否存在有效值,若索引对应位置在code_table中存在有效值,则将该有效值作为哈希链表的首节点,遍历哈希链表的子项,比较每个哈希项中缓存的字符串与传入字符串是否相等,若存在相等字符串,则返回该哈希项的哈希序号;若不存在相等的字符串,则返回查询失败。67.cblock_map的数据缓存结构是根据索引快速读取缓存值,其中cblock_map的底层以二维指针数组形式对数据进行存储和管理,初始化时可定义行、列数值,但不进行内存申请,二维指针数组根据插入时索引位置按需初始化,每次初始化索引所在行的数组。68.cblock_map的底层存储组件进一步配置有初始化单元、数据保存单元和数据读取单元。69.初始化单元,配置为先创建cblock_map类型的指针,构造方法中添加行数、页数的参数,cblock_map底层存储为二维指针数组形式,行数*页数的值规定code_table支持的最大索引数,在数组初始化时,统一将行数组设为空指针,并不进行额外的空间申请;70.数据保存单元,配置为先根据传入哈希序号值,判断所要保存的数据应该位于哪个行数组内,若该行数组不存在,则新建并初始化行数组,再根据哈希序号对页数取余,得到具体的存储位置,把待存储数组更新至该存储位置;71.数据读取单元,配置为先根据传入哈希序号值,判断所要读取的数据应该位于哪个行数组内,若该行数组不存在,则返回读取失败;根据哈希序号对页数取余,得到具体的存储位置,判断存储位置是否为空,为空则返回查询失败,反之返回该索引处存储的值。72.尽管为使解释简单化将上述方法图示并描述为一系列动作,但是应理解并领会,这些方法不受动作的次序所限,因为根据一个或多个实施例,一些动作可按不同次序发生和/或与来自本文中图示和描述或本文中未图示和描述但本领域技术人员可以理解的其他动作并发地发生。73.本领域技术人员将进一步领会,结合本文中所公开的实施例来描述的各种解说性逻辑板块、模块、电路、和算法步骤可实现为电子硬件、计算机软件、或这两者的组合。为清楚地解说硬件与软件的这一可互换性,各种解说性组件、框、模块、电路、和步骤在上面是以其功能性的形式作一般化描述的。此类功能性是被实现为硬件还是软件取决于具体应用和施加于整体系统的设计约束。技术人员对于每种特定应用可用不同的方式来实现所描述的功能性,但这样的实现决策不应被解读成导致脱离了本发明的范围。74.结合本文所公开的实施例描述的各种解说性逻辑板块、模块、和电路可用通用处理器、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或其它可编程逻辑器件、分立的门或晶体管逻辑、分立的硬件组件、或其设计成执行本文所描述功能的任何组合来实现或执行。通用处理器可以是微处理器,但在替换方案中,该处理器可以是任何常规的处理器、控制器、微控制器、或状态机。处理器还可以被实现为计算设备的组合,例如dsp与微处理器的组合、多个微处理器、与dsp核心协作的一个或多个微处理器、或任何其他此类配置。75.结合本文中公开的实施例描述的方法或算法的步骤可直接在硬件中、在由处理器执行的软件模块中、或在这两者的组合中体现。软件模块可驻留在ram存储器、闪存、rom存储器、eprom存储器、eeprom存储器、寄存器、硬盘、可移动盘、cd-rom、或本领域中所知的任何其他形式的存储介质中。示例性存储介质耦合到处理器以使得该处理器能从/向该存储介质读取和写入信息。在替换方案中,存储介质可以被整合到处理器。处理器和存储介质可驻留在asic中。asic可驻留在用户终端中。在替换方案中,处理器和存储介质可作为分立组件驻留在用户终端中。76.在一个或多个示例性实施例中,所描述的功能可在硬件、软件、固件或其任何组合中实现。如果在软件中实现为计算机程序产品,则各功能可以作为一条或更多条指令或代码存储在计算机可读介质上或藉其进行传送。计算机可读介质包括计算机存储介质和通信介质两者,其包括促成计算机程序从一地向另一地转移的任何介质。存储介质可以是能被计算机访问的任何可用介质。作为示例而非限定,这样的计算机可读介质可包括ram、rom、eeprom、cd-rom或其它光盘存储、磁盘存储或其它磁存储设备、或能被用来携带或存储指令或数据结构形式的合意程序代码且能被计算机访问的任何其它介质。任何连接也被正当地称为计算机可读介质。例如,如果软件是使用同轴电缆、光纤电缆、双绞线、数字订户线(dsl)、或诸如红外、无线电、以及微波之类的无线技术从web网站、服务器、或其它远程源传送而来,则该同轴电缆、光纤电缆、双绞线、dsl、或诸如红外、无线电、以及微波之类的无线技术就被包括在介质的定义之中。如本文中所使用的盘(disk)和碟(disc)包括压缩碟(cd)、激光碟、光碟、数字多用碟(dvd)、软盘和蓝光碟,其中盘(disk)往往以磁的方式再现数据,而碟(disc)用激光以光学方式再现数据。上述的组合也应被包括在计算机可读介质的范围内。77.提供对本公开的先前描述是为使得本领域任何技术人员皆能够制作或使用本公开。对本公开的各种修改对本领域技术人员来说都将是显而易见的,且本文中所定义的普适原理可被应用到其他变体而不会脱离本公开的精神或范围。由此,本公开并非旨在被限定于本文中所描述的示例和设计,而是应被授予与本文中所公开的原理和新颖性特征相一致的最广范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1