HASH算法のBKDRHash

说明

今天和别人说一下 hash 算法,起源是因为字符串在数据库做索引的问题,我的想法是字符串通过 hash 算法,得到的 int 类型的数据,在 int 类型的数据库上做索引,但是 hash 算法有很多选择,就 PHP 而言,有人说 10 万数据内的话,用 PHP 内置的 CRC32 算法(abs(crc32($str)))就可以,但是我发现 hash 算法有很多种,其中一种就是 bkdrhash 算法。

设计模式の结构型の组合模式

大概意思

一个接口对于多个实现,并且这些实现中都拥有相同的方法(名)。 有时候你需要只运行一个方法,就让不同实现类的某个方法或某个逻辑全部执行一遍。在批量处理多个实现类时,感觉就像在使用一个类一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
//先建立一个表单
$form = new Form();

//在表单中增加一个Email元素
$form->addElement(new TextElement('Email:'));
$form->addElement(new InputElement());

//在表单中增加一个密码元素
$form->addElement(new TextElement('Password:'));
$form->addElement(new InputElement());

//把表单渲染出来
$form->render();

这个例子形象的介绍了组合模式,表单的元素可以动态增加,但是只要渲染一次,就可以把整个表单渲染出来。

设计模式の结构型の桥接模式

目的

我们知道一个类可以实现多个接口,一个接口对应多个实现。 在不同的实现类中,它实现接口方法的逻辑是不一样的。 有时候我们需要对这些抽象方法进行一些组合,修改,但是又能适用于所有实现类。 这时候我们需要做一个桥,连接不同的实现类并统一标准。

一个接口多个实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 格式化接口
interface FormatterInterface
{
public function format(string $text);
}

// 文本格式化
class PlainTextFormatter implements FormatterInterface
{
public function format(string $text)
{
return $text;
}
}

// HTML格式化
class HtmlFormatter implements FormatterInterface
{
public function format(string $text)
{
return sprintf('<p>%s</p>', $text);
}
}

设计模式の结构型の适配器模式

说明

我们先来看看下面的代码。先来看看接口的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 目标角色(对外一致的接口)
interface Database
{
public function connect();

public function query();

public function close();
}

class Mysql implements Database
{
public function connect()
{
//mysql 的逻辑
}

public function query()
{
//mysql 的逻辑
}

public function close()
{
//mysql 的逻辑
}
}

class Pdo implements Database
{
public function connect()
{
//Pdo 的逻辑
}

public function query()
{
//Pdo 的逻辑
}

public function close()
{
//Pdo 的逻辑
}
}

//使用
$database = new Mysql(); //切换数据库只要改这一行就行了,因为后面的都是标准接口方法,不管哪个数据库都一样。
$database->connect();
$database->query();
$database->close();

设计模式の创建型の原型模式

简介

对象池(也称为资源池)被用来管理对象缓存。对象池是一组已经初始化过且可以直接使用的对象集合,用户在使用对象时可以从对象池中获取对象,对其进行操作处理,并在不需要时归还给对象池而非销毁它。

若对象初始化、实例化的代价高,且需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的性能提升。常见的使用对象池模式的技术包括线程池、数据库连接池、任务队列池、图片资源对象池等。

当然,如果要实例化的对象较小,不需要多少资源开销,就没有必要使用对象池模式了,这非但不会提升性能,反而浪费内存空间,甚至降低性能。

设计模式の创建型の原型模式

实质就是 对象的复制

对一些大型对象,每次去 new,初始化开销很大,这个时候我们 先 new 一个模版对象,然后其他实例都去 clone 这个模版, 这样可以节约不少性能。
这个所谓的模版,就是原型(Prototype);
当然,原型模式比单纯的 Clone 要稍微升级一下。

普通 clone

new 和 clone 都是用来创建对象的方法。
在 PHP 中, 对象间的赋值操作实际上是引用操作 (事实上,绝大部分的编程语言都是如此! 主要原因是内存及性能的问题) ,比如:

linuxの修改语言包

  1. 执行 locale -a 发现存在中文语言包,语言包存放路径应该是 /usr/share/locale/

  2. 执行 echo $LANG 发现语言配置是 C,大概是 ANSI C 的意思。

  3. 修改 /etc/locale.conf 为 LANG=”zh_CN.UTF-8”,并执行 source /etc/locale.conf 使配置生效。

  4. 现在支持中文了,可是提示语也变中文了,我想保留英文作为系统语言,同时支持中文,所以重新修改 /etc/locale.conf LANG=”en_US.UTF-8”,并执行 source

linux の动态库

1. /lib 和 /usr/lib 的区别

/lib 里面给的是 root 和内核所需so(动态库)或者a(静态)之类的库文件,而/usr/lib 是普通用户能够使用的。

Linux 的程序有两种模式,这个你应该知道,是用户模式内核模式,和这个也是有关系的,不再冗述。

简单说,/lib 是内核级的,/usr/lib 是系统级的,/usr/local/lib 是用户级的.

/lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件。目录 /usr/lib/ 中含有更多用于用户程序的库文件。/lib 目录下放置的是/bin 和/sbin 目录下程序所需的库文件。/lib 目录下的文件的名称遵循下面的格式:

1
2
libc.so.*
ld*

Ascii码和字节字符的关系

##关于 Ascii 码的整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 0 < ascii < 128 单字节字符 == 1xxx xxxx

向右移动 7 位等于 0.符合范围内

- 240 <= ascii 四字节字符 == 1111 xxxx

向右移动 4 位=15,符合范围内

- 224 <= ascii < 240 3 字节字符 == 111x xxxx

向右移动 5 位=7,符合范围内

- 192 <= ascii < 224 2 字节字符 11xx xxxx

向右移动 6 位=3,符合范围内