php序号发生器,数字重组,可以隐藏原来的1,2,3。。。
一个晚上的成果,原理:
将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。。。的更多相关文章
- JS对表格排序(支持对序号,数字,字母,日期)
JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...
- 编程算法基础-数字数码管-隐藏password
作业 数字数码管 个数码管) @@@@ 0 @ @ 1 2 @ @ 3 @@@@ ...
- 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]
无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...
- POI问题总结,关于数字级联及多级级联(三级以上)
目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...
- [Swift]LeetCode831. 隐藏个人信息 | Masking Personal Information
We are given a personal information string S, which may represent either an email address or a phone ...
- 页游安全攻与防,SWF加密和隐藏密匙
原文链接:http://netsecurity.51cto.com/art/201211/364775.htm 页游,最最核心的就是客户端(swf)与服务端的游戏通信了.游戏通信产生的封包,内容是否可 ...
- Java实现 LeetCode 831 隐藏个人信息(暴力)
831. 隐藏个人信息 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 . 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (l ...
- 超实用的 JavaScript 代码片段( ES6+ 编写)
Array 数组 Array concatenation (数组拼接) 使用 Array.concat() ,通过在 args 中附加任何数组 和/或 值来拼接一个数组. const ArrayCon ...
- infoq 微信后台存储架构
infoq 上微信后台存储架构 视频很是值得认真一听,大概内容摘要如下: 主要内容:同城分布式强一致,园区级容灾KV存储系统 - sync 序列号发生器 移动互联网场景下,频繁掉线重连,使用 ...
随机推荐
- [OpenCV]OpenCV常用语法函数与坑点
目录 1. 加载图像(cv::imread) 2. 显示图像(cv::nameWindows与cv::imshow) 3. 修改图像(cv::cvtColor) 4. 保存图像(cv::imwrite ...
- Objective C Protocol implementation
protocol 类似于接口,可以实现函数的回调 @protocol MyDelegate<NSObject> -(void)myCallbackFunction; @end //Call ...
- [WCF安全1]使用basicHttpBinding构建UserName授权的WCF应用程序
最近到了新公司,leader让我研究一下WCF的传输安全机制.以前也做过WCF的应用,但是很少涉及安全方面的东西.所以,花了三天的时间研究了一下如何在WCF的应用程序中配置安全.在这个系列文章中,我会 ...
- Grunt Part 1
Grunt Part 1 Objectives and Outcomes In this exercise, you will learn to use Grunt, the task runner. ...
- Kaggle 项目之 Digit Recognizer
train.csv 和 test.csv 包含 1~9 的手写数字的灰度图片.每幅图片都是 28 个像素的高度和宽度,共 28*28=784 个像素点,每个像素值都在 0~255 之间. train. ...
- 关于MAC升级后,vim更新插件报错
找不到路径: 直接在终端 terminal 输入: xcode-select --install
- centos7 卸载安装失败的mysql7
1.查询现在的服务器上面的mysql已经安装了什么内容: rpm -qa |grep -i mysql 2.开始卸载执行命令: yum remove mysql-community-common-5. ...
- 原生javascript-Tab选项卡-面向对象
分析个人用原生JS获取类名元素的代码: getByClassName:function(className,parent){ var elem = [], node = parent != undef ...
- CodeForces 297C Splitting the Uniqueness (脑补构造题)
题意 Split a unique array into two almost unique arrays. unique arrays指数组各个数均不相同,almost unique arrays指 ...
- Bootstrap 可视化布局--拖拽后弹窗进行编辑
Bootstrap 可视化布局--拖拽后弹窗进行编辑 最近后台想一个需求,使用可视化布局-中文 | en中拖拽表格后,弹窗进行编辑,保存下载后在后台生成pdf格式. 奈何各种问题不断,使用 jquer ...