一个晚上的成果,原理:

将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. 【转】GitHub汉化脚本(谷歌浏览器)

    // ==UserScript== // @name GitHub 汉化插件 // @description 汉化 GitHub 界面的部分菜单及内容. // @copyright 2016, 楼教主 ...

  2. HMM代码实践

    本文主要转载于:http://www.52nlp.cn/hmm-learn-best-practices-eight-summary 这个文章是边看边实践加上自己的一些想法生成的初稿..... 状态转 ...

  3. GTS--阿里巴巴分布式事务全新解决方案

    现代IT应用中,服务化SOA作为主流的技术架构被广泛应用到各种信息系统.原来一个系统被分拆成若干个服务的集合,产生了跨服务调用的分布式事务问题.随着Dubbo.SpringCloud等微服务框架的流行 ...

  4. dropout 为何会有正则化作用

    在神经网络中经常会用到dropout,大多对于其解释就是dropout可以起到正则化的作用. 一下是我总结的对于dropout的理解.花书上的解释主要还是从模型融合的角度来解释,末尾那一段从生物学角度 ...

  5. linux加域退域

    realm list realm leave od.com realm join -U Administrator od.com

  6. 设计模式--策略模式C++实现

    策略模式C++实现 1定义 (Strategy Pattern)定义一组算法,将每个算法都封装起来,并且使他们可以相互替换 也叫政策模式 2类图 3实现 class Strategy{ protect ...

  7. Java获取未知类型对象的属性

    获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...

  8. ( 转)Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法

    一.类型比较 bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节.一个字节就是8位,那么b ...

  9. 【51nod-1521】一维战舰

    爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a 的长 ...

  10. 二十三、DBMS_METADATA(提供提取数据库对象的完整定义的接口)

    1.概述 作用:提供提取数据库对象的完整定义的接口.这些定义可以用XML或SQL DDL格式描述.提供两种类型接口:可编程控制的接口:用于Ad Hoc查询的简单接口. 2.包的组成 dbms_meta ...