Heim >php教程 >php手册 >一个双射类,在给定自然数空间一对一完全映射,可逆运算,不可猜

一个双射类,在给定自然数空间一对一完全映射,可逆运算,不可猜

WBOY
WBOYOriginal
2016-06-06 19:33:331093Durchsuche

使用大质数、模运算原理,在给定自然数空间,把每个自然数映射到另一个自然数,并且被映射的自然数只被此自然数映射。 主要用于生成和自增id对应的在自然数空间均匀分布的不可猜解的对应自然数。 用于快递物流单号、订单号、图片路径等有隐私保护的资源uri。

使用大质数、模运算原理,在给定自然数空间,把每个自然数映射到另一个自然数,并且被映射的自然数只被此自然数映射。
主要用于生成和自增id对应的在自然数空间均匀分布的不可猜解的对应自然数。
用于快递物流单号、订单号、图片路径等有隐私保护的资源uri。
/**
 * 双射类
 * 在给定自然数空间一对一完全映射,可逆运算,不可猜解
 * @author liuxu
 *
 */
class Bijective
{
	static private $defaultPrime = '85310501873';//请使用个位为"3"、"7"、"9"的质数

	static public function getRandPrime()
	{
		return self::getMinPrime(rand(100000,900000)*100000+rand(100000,900000));
	}

	static public function getMinPrime($min)
	{
		$number = $min;
		while(true)
		{
			if(self::isPrime($number)) break;
			$number++;
		}

		return $number;
	}

	static public function isPrime($number)
	{
		$sqrt = intval(bcsqrt($number,0));
		for($i=2;$i<=$sqrt;$i++)
		{
			if(bcmod($number,$i)==='0')
			{
				return false;
			}
		}

		return true;
	}

	static public function mod($number,$len=10)
	{
		return bcmod(bcmul($number,self::$defaultPrime,0),bcpow(10,$len,0));
	}

	static public function loop($number,$len=8)
	{

		$min = $prev = $number;
		for($i=1;;$i++)
		{
			$next = self::mod($prev,$len);
			if($next==$number) break;
			$min = min($min,$next);
			$prev = $next;
		}

		$offset = ( $min % $i ) + 1;
		for($j=0;$j<$offset;$j++)
		{
			$number = self::mod($number,$len);
		}

		return $number;
	}

	static public function insanity($number,$len=10)
	{
		$number = self::mod($number,$len);
		$number = str_pad($number,$len,'0',STR_PAD_LEFT);

		$numberList = str_split($number,6);
		foreach($numberList as $key=>$value)
		{
			$numberList[$key] = str_pad(self::loop($value,strlen($value)),strlen($value),'0',STR_PAD_LEFT);
		}

		$number = implode('',$numberList);

		return $number;
	}

}
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:大文件读取类Nächster Artikel:真·水仙花开