生成函数

PHP生成唯一订单号

烂漫一生 提交于 2019-12-09 20:34:34
在日常的网站开发中,我们经常需要生成唯一的订单号。订单号太短,在高迸发情况下,很容易造成订单号重复事件,虽然是小概率事件。 下面我们使用PHP多个函数生成一个现在最常用的订单号格式: $order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); 加了毫秒,变成25位了,重复几率更小 $order_number = date('YmdHi'). substr(microtime(), 2, 5) .substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); 简单从内到外解析一下这个订单号生成过程: date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字 uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一ID。 substr(uniqid(), 7, 13):由于uniqid()函数生成的结果前面7位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。 str_split(substr(uniqid(), 7, 13), 1)

Java8 Stream常用函数及使用说明

China☆狼群 提交于 2019-12-09 06:30:55
1. 什么是Stream? Stream作为java8中增加的一个非常重要特性,为我们提供了对集合的一系列操作,简化了对集合元素的操作复杂度,让我们可以更加专注与业务逻辑的实现,stream的操作一般需要和Lambda表达式进行结合使用,达到简便的操作及清晰的代码。 Stream的使用主要分两部分: 惰性求值 (of, map, flatmap, filter…) 及早求值 (reduce, max, min, collect…) 2. 什么是惰性求值和及早求值? 判断一个操作是惰性求值还是及早求值可以通过操作的返回值进行判断,如果返回的是一个stream,那么就是惰性求值,否则就是及早求值。 惰性求值的特点: 惰性求值的操作并没有对集合元素进行实际的遍历,只有在进行及早求值的时候才开始遍历元素。 惰性求值返回的是stream对象。 3. 如何使用Stream函数对集合进行操作? 在日常的使用中,我们都是惰性求值和及早求值进行配合,一般来说,先对集合进行惰性求值,最后再对生成的新stream对象进行及早求值。 大家可以把stream的操作过程想像成一个生产线,我们的集合元素从生产线的一头进入,然后在生产线的另一头重新生成集合或者元素,进入的过程就是生成一个steam对象,即第一次惰性求值,出来的时候是一个及早求值的过程,将steam重新生成集合或者元素

Java 8系列之Stream的强大工具Collector

左心房为你撑大大i 提交于 2019-12-09 05:31:25
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的reduce 概述 前面我们使用过collect(toList()),在流中生成列表。实际开发过程中,List又是我们经常用到的数据结构,但是有时候我们也希望Stream能够转换生成其他的值,比如Map或者set,甚至希望定制生成想要的数据结构。 collect也就是收集器,是Stream一种通用的、从流生成复杂值的结构。只要将它传给collect方法,也就是所谓的转换方法,其就会生成想要的数据结构。这里不得不提下,Collectors这个工具库,在该库中封装了相应的转换方法。当然,Collectors工具库仅仅封装了常用的一些情景,如果有特殊需求,那就要自定义了。 显然,List是能想到的从流中生成的最自然的数据结构, 但是有时人们还希望从流生成其他值, 比如 Map 或 Set, 或者你希望定制一个类将你想要的东西抽象出来。 前面已经讲过,仅凭流上方法的签名,就能判断出这是否是一个及早求值的操作。 reduce操作就是一个很好的例子, 但有时人们希望能做得更多。 这就是收集器,一种通用的、从流生成复杂值的结构。只要将它传给collect 方法,所有的流就都可以使用它了。 <R, A

ASM原理详解,以及使用附代码,AOP利器

雨燕双飞 提交于 2019-12-08 10:03:49
少年,git代码,带你快速理解: https://github.com/singgel/eight-sorting-algorithms/tree/master/src/test/java/com/hks/eightsortingalgorithms/asm 一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的,而使用字节码增强技术后反射调用的时间已经基本可以与直接调用相当了   使用ASM框架需要导入asm的jar包,下载链接:asm-3.2.jar。 二、如何使用ASM   ASM框架中的核心类有以下几个:   ① ClassReader:该类用来解析编译过的class字节码文件。   ② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法

jquery中对动态生成的标签不会响应click事件

不羁的心 提交于 2019-12-07 21:37:30
Jquery中对ajax动态生成的html标签不会响应 $(selector).click(function.. 或者$(selector).bind('click',function.., 需要用.live jQuery 1.7 开始 ,不再建议使用 .live() 方法。请使用 .on() 来添加事件处理。使用旧版本的用户,应该优先使用 .delegate() 来替代 .live()。 返回值:jQuerylive(type, [data] , fn) 概述 jQuery 给所有匹配的元素附加一个事件处理函数,即使这个元素是 以后再添加进来的也有效。 这个方法是基本是的 .bind() 方法的一个变体。使用 .bind() 时,选择器匹配的元素会附加一个事件处理函数,而以后再添加的元素则不会有。为此需要再使用一次 .bind() 才行。比如说 <body> <div class="clickme">Click here</div> </body> 可以给这个元素绑定一个简单的click事件: $('.clickme').bind('click', function() { alert("Bound handler called."); }); 当点击了元素,就会弹出一个警告框。然后,想象一下这之后有另一个元素添加进来了。 $('body').append('<div class

Flask学习记录

不羁岁月 提交于 2019-12-07 06:32:58
Flask是一个使用Python编写的轻量级web框架,相比其他框架如Django更加简单易学。本文将实现一个简单示例,完成以下功能:从数据库中读取用户信息,在浏览器中分页展示,添加分页导航栏,并且实现根据用户名搜索。用到的主要知识点:数据库操作、表单、Jinja2模板。 学习环境搭建 操作系统 CentOS Linux release 7.4.1708 (Core) 执行yum update -y然后重启系统,确保软件包处于最新状态。 Python版本 2.7.5 安装Python虚拟环境 利用virtualenv可以实现一个隔离的Python环境,在这个虚拟环境中安装、删除Python的pip包而不会影响环境外的其他进程。虚拟环境还会让系统移植更容易,只要把虚拟环境的文件拷到另一个系统中然后恢复虚拟环境,就可以保证跟之前的Python包环境一模一样。 安装virtualenv: [root@localhost ~]# pip install virtualenv Collecting virtualenv Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB) 100% |████████████████████████████████| 1.8MB 78kB/s Installing collected

jni介绍

早过忘川 提交于 2019-12-06 08:30:36
JNI JNI 是 Java Native Interface 的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、 操作系统 进行交互,或者为了提高 程序 的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 一、JNI(Java Native Interface)的设计目的 ·The standard Java class library may not support the platform-dependent features needed by your application. ·You may already have a library or application written in another programming language and you wish to make it accessible to Java applications ·You may want

Protocol Buffer技术详解(C++实例)

安稳与你 提交于 2019-12-06 08:22:51
这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较有利于培训和内部的技术交流。还是那句话,没有最好的,只有最适合的。我想写Blog也是这一道理吧,不同的技术主题可能需要采用不同的风格。好了,还是让我们尽早切入主题吧。 一、生成目标语言代码。 下面的命令帮助我们将MyMessage.proto文件中定义的一组Protocol Buffer格式的消息编译成目标语言(C++)的代码。至于消息的内容,我们会在后面以分段的形式逐一列出,同时也会在附件中给出所有源代码。 protoc -I=./message --cpp_out=./src ./MyMessage.proto 从上面的命令行参数中可以看出,待编译的文件为MyMessage.proto,他存放在当前目录的message子目录下。--cpp_out参数则指示编译工具我们需要生成目标语言是C++,输出目录是当前目录的src子目录。在本例中,生成的目标代码文件名是MyMessage.pb.h和MyMessage.pb.cc。 二、简单message生成的C++代码。 这里先定义一个最简单的message,其中只是包含原始类型的字段。 option optimize_for = LITE_RUNTIME; message

Protocol Buffer技术详解(Java实例)

回眸只為那壹抹淺笑 提交于 2019-12-06 08:22:36
该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发团队中目前主要使用的开发语言就是C++、Java和Python,其中Python主要用于编写各种工具程序。然而为了保证该篇Blog的完整性和独立性,我仍然会将上一篇Blog中已经出现的内容再一次赘述,同时对于Java中特有的部分也会着重介绍。 一、生成目标语言代码。 下面的命令帮助我们将MyMessage.proto文件中定义的一组Protocol Buffer格式的消息编译成目标语言(Java)的代码。至于消息的内容,我们会在后面以分段的形式逐一列出,同时也会在附件中给出所有源代码。 protoc -I=./message --java_out=./src ./MyMessage.proto 从上面的命令行参数中可以看出,待编译的文件为MyMessage.proto,他存放在当前目录的message子目录下。--java_out参数则指示编译工具我们需要生成目标语言是java,输出目录是当前目录的src子目录。这里需要补充说明的是,因为在MyMessage.proto文件中定义了option java_package = "com.lsk.lyphone"的文件级选项,所以输出的目前是src/com/lsk/lyphone

【个人笔记】Python列表与列表生成式

帅比萌擦擦* 提交于 2019-12-06 03:50:17
在Python语言中,所谓的列表生成式,就是说可以生成list列表的表达式,是Python内置的一种强大的功能。    1.1、Python 列表(List)      python里面 [ ] 表示一个列表     列表是最常用的Python数据类型     创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:      list = [1,2,3,4,5,6,7]     序列都可以进行的操作包括索引,切片,加,乘,检查成员。索引的值从0开始,也可以从最后一个开始数,那么最后一个就是倒数第一,也就是-1,以此类推 list_num = [1, 2, 3, 4, 5, 6, 7] # 输出索引为0的值并打印 print(list_num[0]) # 输出索引为-1的值并打印 print(list_num[-1]) # 用索引值来修改列表 list_num[3] = 10 # 打印列表 print(list_num)     打印结果如下     对列表进行切片操作: list_num = [1, 2, 3, 4, 5, 6, 7] # 对列表进行切片操作 切片遵循左闭右开原则 list_num1 = list_num[0:-1] # 打印列表list_num1 print(list_num1)     打印结果如下   1.2、快速生成一个列表