一个晚上的成果,原理:

将1,2,3,4,5,6,7,8,9,0映射到9,5,1,0,4,8,7,3,2,6

同理映射base,base有1-10种数组,也就是可以一位数到10位数

$base 实际上是下面的根据下面数组处理得来的。

array(
array(0),
array(1,0),
array(2,0,1),
array(3,0,2,1),
array(4,0,1,3,2),
array(5,1,0,4,3,2),
array(6,2,0,4,5,1,3),
array(7,3,0,4,6,2,1,5),
array(8,4,0,1,5,7,3,2,6),
array(9,5,1,0,4,8,7,3,2,6)
);

参数$num是种子数,$m是结果位数,$offset一个偏移值(可以更有效的打乱数字)。

function seq10($num, $m, $offset = 0) {
static $seq = array(9,5,1,0,4,8,7,3,2,6);
static $base = array(
array(1,10),
array(10,1,100),
array(100,1,10,1000),
array(1000,1,100,10,10000),
array(10000,1,10,1000,100,100000),
array(100000,10,1,10000,1000,100,1000000),
array(1000000,100,1,10000,100000,10,1000,10000000),
array(10000000,1000,1,10000,1000000,100,10,100000,100000000),
array(100000000,10000,1,10,100000,10000000,1000,100,1000000,1000000000),
array(1000000000,100000,10,1,10000,100000000,10000000,1000,100,1000000,10000000000)
);
$res = $num;
for ($i = 0; $i < 16; $i++) {
$num = 0;
for ($j = 0; $j < $m; $j++) {
$num += $seq[$res % 10] * $base[$m-1][$j];
$res /= 10;
}
$res = ($num + $offset + $i) % $base[$m-1][$m];
}
return $res;
}

通过调用上面的函数,便可以进行任意数字映射,如1-100映射结果到1-100

$arr = array();
$start = microtime(true);
for ($i = 1; $i < 100; $i++) $arr[$i] = seq10($i, 2, 12);
$end = microtime(true);
print_r($arr);
echo count($arr)."\n";
echo $end - $start; 结果:
E:\>php seq.php
Array
(
[1] => 8
[2] => 88
[3] => 16
[4] => 75
[5] => 0
[6] => 58
[7] => 70
[8] => 91
...
[90] => 29
[91] => 51
[92] => 66
[93] => 23
[94] => 62
[95] => 54
[96] => 22
[97] => 3
[98] => 34
[99] => 72
)
99
0.002357006072998

1-10映射到6位数

$arr = array();
$start = microtime(true);
for ($i = 1; $i < 10; $i++) $arr[$i] = seq10($i, 6, 123456);
$end = microtime(true);
print_r($arr);
echo count($arr)."\n";
echo $end - $start; E:\>php seq.php
Array
(
[1] => 721627
[2] => 782511
[3] => 256581
[4] => 969508
[5] => 451505
[6] => 928354
[7] => 302664
[8] => 387627
[9] => 817626
)
9
0.00050187110900879

唯一性验证:

$arr = array();
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) $arr[seq10($i, 6, 123456)] = 1;
$end = microtime(true);
//print_r($arr);
echo count($arr)."\n";
echo $end - $start; E:\>php seq.php
1000000
36.970967054367

php序号发生器,数字重组,可以隐藏原来的1,2,3。。。的更多相关文章

  1. JS对表格排序(支持对序号,数字,字母,日期)

    JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...

  2. 编程算法基础-数字数码管-隐藏password

    作业 数字数码管 个数码管) @@@@         0     @          @       1   2     @          @         3        @@@@    ...

  3. 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]

    无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...

  4. POI问题总结,关于数字级联及多级级联(三级以上)

    目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...

  5. [Swift]LeetCode831. 隐藏个人信息 | Masking Personal Information

    We are given a personal information string S, which may represent either an email address or a phone ...

  6. 页游安全攻与防,SWF加密和隐藏密匙

    原文链接:http://netsecurity.51cto.com/art/201211/364775.htm 页游,最最核心的就是客户端(swf)与服务端的游戏通信了.游戏通信产生的封包,内容是否可 ...

  7. Java实现 LeetCode 831 隐藏个人信息(暴力)

    831. 隐藏个人信息 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 . 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (l ...

  8. 超实用的 JavaScript 代码片段( ES6+ 编写)

    Array 数组 Array concatenation (数组拼接) 使用 Array.concat() ,通过在 args 中附加任何数组 和/或 值来拼接一个数组. const ArrayCon ...

  9. infoq 微信后台存储架构

    infoq 上微信后台存储架构 视频很是值得认真一听,大概内容摘要如下: 主要内容:同城分布式强一致,园区级容灾KV存储系统 - sync 序列号发生器      移动互联网场景下,频繁掉线重连,使用 ...

随机推荐

  1. 通过visual studio修改dll或exe的版本信息

    可以编辑修改了 来自为知笔记(Wiz)

  2. 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录

    问题描述 今天在一个新的Linux环境添加用户的时候,发现不能添加,遇到了以下错误 useradd: cannot open /etc/passwd 解决方法 用lsattr命令查看/etc/pass ...

  3. 《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

    <深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分 ...

  4. 强连通分量算法-codevs1332

    解决有向图的强连通分量的算法,有两个,一个是tarjan,一个是kosaraju,上午只看了一下kosaraju,不算太难,理解之后写了个模板题. 先说kosaraju算法,算法的主要思路是进行两次d ...

  5. .pth 文件扩展python环境路径

    有时候我们不希望把一个库放到 site-packages 下面,而是更愿意把它保留在原始的工程目录中,方便管理和维护. 通常的做法是在程序启动的时候,往sys.path里面增加这个目录,但是这样做非常 ...

  6. 七种常见经典排序算法总结(C++)

    最近想复习下C++,很久没怎么用了,毕业时的一些经典排序算法也忘差不多了,所以刚好一起再学习一遍. 除了冒泡.插入.选择这几个复杂度O(n^2)的基本排序算法,希尔.归并.快速.堆排序,多多少少还有些 ...

  7. Post with HttpClient4

    转载:http://www.cnblogs.com/luxiaoxun/p/6165237.html 作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ HttpC ...

  8. js 返回上一页和刷新以及页面跳转

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  9. Java进阶5 面向对象的陷阱

    Java进阶5 面向对象的陷阱 20131103 Java是一门纯粹面向对象的编程语言,Java面向对象是基础,而且面向对象的基本语法非常多,非常的细,需要程序员经过长时间的学习才可以掌握.本章重点介 ...

  10. kvm虚拟主机安装速度很慢

    在c6220 II上部署虚拟化遇到的问题: 1.部署完kvm后,安装虚拟主机的过程非常缓慢,但是最终能成功 原因:宿主机BIOS的virtualization technology设置为Disable ...