具体实施方式
伪随机算法采用递推公式来生成随机数,根据具体算法的不同,递推公式可以是一阶的,也可以是二阶或多阶的。以二阶为例,其递推公式如式1所示:
xn+2=f(xn+1,xn),n≥0 式1
式1中,xn、xn+1、xn+2为随机因子。对二阶递推算法,x0和x1为初始值。
所生成的随机数序列如式2所示:
rk=g(xk),k≥2 式2
根据具体应用场景的需求,可以将随机因子直接作为所生成的随机数(此时rk=xk);也可以对随机因子做数学变换后得到对应的随机数。
并非所有的递推算法都可以用来生成随机数,只有用递推算法产生出来的序列经过检验符合一些统计学要求,如均匀性、抽样的随机性等满足一定条件,这样的递推算法才会被作为伪随机算法使用。也就是说,伪随机算法以某个初始值开始,递推若干次生成一系列随机因子,这些随机因子基本不会有重复的情况发生。
这样,当集群中的第一个节点上要生成L个随机数时,意味着递推在该节点上将进行L次,如果第二个节点以该节点递推至少L次后所得的随机因子作为初始值,则第二个节点的初始值与第一个节点的初始值基本不会相同。将这个方式推广到集群中用来生成随机数的所有节点,则每个节点的初始值与其他节点的初始值都基本不会相同。
基于上述思路,本申请的实施例提出一种新的伪随机数的生成方法,在集群中可供各个节点访问的预定存储位置保存初始值,在每个节点从该预定存储位置读取初始值后,进行若干次递推运算后得到本节点不会继续用于递推运算的随机因子,将其作为初始值写入预定存储位置,以供其他节点使用,从而基本能够确保每个节点的初始值都与其他节点不同,以解决现有技术中存在的问题。
本申请实施例中的集群包括至少两个节点,每个节点是一个运行伪随机算法生成随机数的单位,例如,节点可以是一台物理服务器、一个逻辑设备(如虚拟机或模拟器)、或者一个独立运行的程序实例等等。本申请的实施例中对集群的运行方式和组网结构、节点的种类和通信方式等均不做限定。
本申请实施例中,在每个节点上运行的伪随机数的生成方法的流程如图1所示。
步骤110,从预定存储位置获取启动随机因子。
本申请的实施例中,预定存储位置可被集群中运行伪随机算法的所有节点访问,并且这些节点对保存在预定存储位置的内容都具有读写的权限。预定存储位置可以是在集群中的某个节点上,也可以在集群外的设备上,不做限定。例如,
启动随机因子被节点用来作为初始值,输入递推公式以生成随机数序列。集群中每个节点上运行相同阶数的伪随机算法,不同阶数的伪随机算法的初始值个数不同。启动随机因子的个数与节点上运行的伪随机算法的阶数相同,预定存储位置所保存的值的个数与每个节点的启动随机因子的个数相同。当启动随机因子的个数超过一个时,每个节点按照同样的顺序将预定存储位置保存的值赋予各个启动随机因子。
步骤120,根据启动随机因子和本节点要生成随机数的个数上限,确定中止随机因子,并将中止随机因子写入所述预定存储位置。
假设本节点要生成随机数的个数上限为N(N为自然数),在从预定存储位置读取启动随机因子后,节点以启动随机因子为初始值,用伪随机算法中的递推公式进行至少K次递推(K不小于N),设节点所使用伪随机算法的阶数m(m为自然数),将递推得到的第K个随机因子到第(K-m-1)个随机因子作为中止随机因子。节点将中止随机因子写入预定存储位置,将预定存储位置原来的值更新为中止随机因子。当中止随机因子超过一个时,每个节点按照与从预定存储位置读取启动随机因子时同样的顺序,将中止随机因子写入预定存储位置。
例如,对采用一阶递推算法的伪随机算法,启动随机因子和中止随机因子都只有一个,节点以启动随机因子作为初始值,运行N次伪随机算法,得到第N个随机因子。由于本节点要生成随机数的个数上限为N,本节点不会再用第N个随机因子来递推第(N+1)个随机因子,因此本节点可以将第N个随机因子作为中止随机因子,写入到预定存储位置,供其他节点作为启动随机因子使用。
在一些应用场景中,整个集群需要利用某个伪随机算法生成不超过某个确定数量的随机数,此时可以将这个确定数量的随机数作为每个节点上要生成随机数的个数上限。如果整个集群要生成的随机数数量难以确定,则在每个节点上要生成的随机数的个数上限也难以确定,此时可以令每个节点按照批次来生成随机数,每批次生成一定数量的随机数,当一个批次生成的随机数达到该数量时,节点从预定存储位置重新获取初始值。具体而言,在每批次的起始,节点从预定存储位置获取启动随机因子,并将本批次剩余数量置为本批次个数上限;节点以启动随机因子作为初始值,在每次需要生成随机数时即运行一次伪随机算法得到下一个随机因子,并将本批次剩余数量减一,直到本批次剩余数量为零;当本批次剩余数量为零时,节点启动下一个批次,从预定存储位置获取启动随机因子并用本批次个数上限重置本批次剩余数量。
需要说明的是,节点各个批次的本批次个数上限可以相同,也可以不同。本批次个数上限可以由管理员预先手动设置,可以由集群控制器按照集群运行状况确定并通知节点,还可以由节点根据自身运行情况自动生成,本申请的实施例不做限定。当节点各个批次的本批次个数上限可能不同时,节点可以在本批次剩余数量为零时,获取下一个批次的本批次个数上限值。
在从一个节点由预定存储位置读取启动随机因子,到将预定存储位置更新为中止随机因子的访问期间内,可能有其他节点希望从预定存储位置获得初始值。为了避免此时其他节点获得相同的初始值,节点可以在从预定存储位置获取启动随机因子前,对预定存储位置加锁;并在将中止随机因子写入预定存储位置后,对预定存储位置解锁。这样,其他节点只有在该节点将预定存储位置的值更新完毕后,才能读取到初始值。
需要说明的是,不同的具体应用场景中预定存储位置的实现不同,如果场景中预定存储位置的访问机制本身已经提供了加锁和解锁功能,例如预定存储位置是各个节点可访问的数据库中的某条记录,则不再需要对预定存储位置另行加锁和解锁。
步骤130,以启动随机因子作为初始值,根据伪随机算法生成不超过所述个数上限的随机数。
在得到启动随机因子后,当需要生成随机数时,在本节点要生成随机数的个数上限内,节点运行伪随机算法,逐次递推生成随机数序列。
在每个节点按照批次来生成随机数的实现中,本节点在要生成随机数的本批次个数上限内,运行伪随机算法生成随机数序列。
可见,本申请的实施例中,在集群中可供各个节点访问的预定存储位置保存运行伪随机算法的初始值,每个节点在获得初始值后都将保存的值更新为不重复的值,以供其他节点作为初始值使用。这样能够使得每个节点都使用不同的初始值来生成随机数,极大的降低了不同节点生成相同随机数的可能性,避免了因初始值重复导致的集群运行速度下降,并且能够缩短集群对用户的响应时间。
此外,如果集群中各个节点上运行的伪随机算法不同,或者运行相同的伪随机算法但除初始值之外所采用的参数不同,对整个集群生成的所有随机数而言,其统计学特性往往不如一个节点上递推生成的随机数序列。而本申请的实施例中,当集群中的每个节点上运行相同的伪随机算法,并且除初始值外,每个节点运行的伪随机算法的其他参数相同时,整个集群中各个节点生成的随机数相当于一个节点上生成的随机数序列,能够达到良好的统计学指标,提高了集群产生的随机数的质量。
在本申请的一个应用示例中,集群包括多个节点,每个节点是一个jvm(Java Virtual Machine,Java虚拟机)实例。该集群用来接收用户的请求,生成随机口令后作为响应回复给用户。每个jvm实例都通过线性同余算法来生成随机数序列,并且除初始值外,每个jvm实例上线性同余算法所采用的其他参数相同。
在集群中所有jvm实例可访问的数据库中的预定位置,保存有线性同余算法随机因子的初始值。在数据库中建立用于存储初始值的表,一种可能的结构如表1所示:
ID |
Gmt_create |
Gmt_modified |
Seed |
1 |
2015/4/4 |
2015/4/4 |
0 |
表1
表1中,ID为行标识;Gmt_create为创建该记录的发生时间;Gmt_modified为该记录最近一次修改的发生时间;Seed为当前所保存的随机因子的初始值。
各个jvm实例按照批次来生成随机数,每个jvm实例上预置有每批次运行次数常量T,也即每批次可生成的随机数的个数上限。
在启动运行时,每个jvm实例上剩余运行次数变量的值为0。在每次收到用户的随机口令请求时,各个jvm实例上的运行流程如图2所示。
步骤201,接收用户的随机口令请求。
步骤202,判断本批次的剩余运行次数是否为零,如果是,执行步骤203;如果否,转步骤207;
步骤203,从数据库中的预定位置读取启动随机因子。在jvm实例访问数据库中的该记录时,数据库将该记录加锁。
步骤204,将启动随机因子作为初始值,执行T次线性同余算法,将递推出的第T个随机因子作为中止随机因子。
步骤205,将中止随机因子写入数据库中的预定位置,更新该记录。在jvm实例将记录更新完毕后,数据将该记录解锁。
步骤206,将上一个随机因子变量置为启动随机因子,将本批次剩余运行次数置为T。
步骤207,由上一个随机因子递推得出本次随机因子,将上一个随机因子变量置为本次随机因子,并将剩余运行次数减一。
步骤208,根据本次运行所得的随机因子生成随机口令,作为对用户请求的响应返回给用户。
与上述流程实现对应,本申请的实施例还提供了一种应用在集群节点上的伪随机数的生成装置。该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是集群节点所在设备的CPU(Central Process Unit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图3所示的CPU、内存以及非易失性存储器之外,伪随机数的生成装置所在的设备通常还包括用于实现网络通信功能的板卡等其他硬件。
图4所示为本申请实施例提供的一种伪随机数的生成装置,应用在集群中的节点上,所述装置包括初始值获取单元、初始值生成单元和随机数生成单元,其中:初始值获取单元用于从预定存储位置获取启动随机因子;初始值生成单元用于根据启动随机因子和本节点要生成随机数的个数上限,确定中止随机因子,并将中止随机因子写入所述预定存储位置;随机数生成单元用于以启动随机因子作为初始值,根据伪随机算法生成不超过所述个数上限的随机数。
可选的,所述初始值生成单元具体用于:以启动随机因子作为初始值,运行N次所述伪随机算法,将得到的第N个随机因子作为中止随机因子,并将中止随机因子写入所述预定存储位置;N为本节点要生成随机数的个数上限。
可选的,所述个数上限为本节点本批次要生成的随机数的本批次个数上限;所述装置还包括剩余数量重置单元和剩余数量更新单元,其中:剩余数量重置单元用于在从预定存储位置获取启动随机因子后,将本批次剩余数量置为本批次个数上限;剩余数量更新单元用于在生成每个随机数之后,将本批次剩余数量减一,直到本批次剩余数量为零;所述初始值获取单元具体用于:当本批次剩余数量为零时,从预定存储位置获取本批次启动随机因子。
可选的,所述装置还包括加锁单元和解锁单元,其中:加锁单元用于在从预定存储位置获取启动随机因子前,对预定存储位置加锁;解锁单元用于在将中止随机因子写入预定存储位置后,对预定存储位置解锁。
可选的,所述集群中的每个节点上运行相同的伪随机算法;除初始值外,所述伪随机算法采用的其他参数相同。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。