PHP中的哈希表
perl hash变量

perl hash变量
Perl中的哈希变量(HashVariable)是一种用于存储键值对的数据结构。
哈希变量可以存储任意类型的值,其中键(Key)是唯一的,可以是字符串或数字类型。
哈希变量在Perl中通常使用%符号进行声明和访问。
哈希变量的声明方式如下所示:
%hash = ('key1', 'value1', 'key2', 'value2');
其中,%hash表示哈希变量的名称,key1和key2分别是哈希变量的键,value1和value2分别是哈希变量的值。
哈希变量的访问方式可以使用键进行访问,如下所示:
$hash{'key1'};
这将返回哈希变量中key1对应的值value1。
在Perl中,可以使用foreach循环来遍历哈希变量中的所有键值对,如下所示:
foreach $key (keys %hash) {
print '$key : $hash{$key}
';
}
上述代码将会输出哈希变量中所有键值对的内容。
除了使用常规的方式声明和访问哈希变量外,也可以使用Perl 提供的许多内置函数来处理哈希变量,如delete、exists、keys、values等。
总之,哈希变量在Perl编程中发挥了重要作用,它是一种非常有用的数据结构,可以用于存储和处理各种类型的数据。
delphi中的键值对, 自制Hashtable

delphi中的键值对, 自制HashtableJava 中的Hashtable 类小巧好用,尤其是因为采用了哈希算法,查找的速度奇快。
后来因工作需要,使用Delphi 实施一些项目,特别不习惯没有哈希表的日子。
于是决定自己动手做一个。
不必白手起家,Delphi 中有一个THashedStringList 类,它位于IniFiles 单元中。
它里面有一个不错的哈希算法,解决冲突的机制是“链地址”。
把这个类改装改装,就成了自己的了。
新鲜热辣,火爆出炉。
下面就来看看新的Hashtable 长得何许模样。
Hashtable.pas--------------------------------------------------------------------------------unit Hashtable;interfaceuses SysUtils, Classes;type{ THashTable }PPHashItem = ^PHashItem;PHashItem = ^THashItem;THashItem = recordNext: PHashItem;Key: string;Value: String;end;THashTable = classprivateBuckets: array of PHashItem;protectedfunction Find(const Key: string): PPHashItem; function HashOf(const Key: string): Cardinal; virtual; publicconstructor Create(Size: Integer = 256);destructor Destroy; override;procedure Put(const Key: string; Value: String); procedure Clear;procedure Remove(const Key: string);function Modify(const Key: string; Value: String): Boolean;function Get(const Key: string): String;end;implementation{ THashTable }procedure THashTable.Put(const Key: string; Value: String);varHash: Integer;Bucket: PHashItem;beginHash := HashOf(Key) modCardinal(Length(Buckets));New(Bucket);Bucket^.Key := Key;Bucket^.Value := Value;Bucket^.Next := Buckets[Hash];Buckets[Hash] := Bucket;end;procedure THashTable.Clear;varI: Integer;P, N: PHashItem;beginfor I := 0 to Length(Buckets) - 1 dobeginP := Buckets[I];while P <> nil dobeginN := P^.Next;Dispose(P);P := N;end;Buckets[I] := nil;end;end;constructor THashTable.Create(Size: Integer);begininherited Create;SetLength(Buckets, Size);end;destructor THashTable.Destroy;beginClear;inherited;end;function THashTable.Find(const Key: string): PPHashItem;varHash: Integer;beginHash := HashOf(Key) modCardinal(Length(Buckets));Result := @Buckets[Hash];while Result^ <> nil dobeginif Result^.Key = Key thenExitelseResult := @Result^.Next;end;end;function THashTable.HashOf(const Key: string): Cardinal;varI: Integer;beginResult := 0;for I := 1 to Length(Key) doResult := ((Result shl 2) or (Result shr(SizeOf(Result) * 8 - 2))) xorOrd(Key[I]);end;function THashTable.Modify(const Key: string; Value: String): Boolean;varP: PHashItem;P := Find(Key)^;if P <> nil thenbeginResult := True;P^.Value := Value;endelseResult := False;end;procedure THashTable.Remove(const Key: string); varP: PHashItem;Prev: PPHashItem;beginPrev := Find(Key);P := Prev^;if P <> nil thenbeginPrev^ := P^.Next;Dispose(P);end;function THashTable.Get(const Key: string): String;varP: PHashItem;beginP := Find(Key)^;if P <> nil thenResult := P^.Value elseResult := '';end;end.--------------------------------------------------------------------------------使用起来就简单了:HashTable := THashTable.Create(); //创建HashTable.Put(Key, Value); //赋值Value=HashTable.Get(Key); //取值HashTable.Destroy; //撤消本程序在Delphi 6.0下通过。
thinkphp rediscluster 使用方式

thinkphp rediscluster 使用方式ThinkPHP 是一款流行的PHP开发框架,它为开发者提供了丰富的功能和便利的开发环境。
其中,RedisCluster 是一个基于Redis 的分布式集群解决方案,可以帮助我们搭建高性能和高可用性的Redis 集群环境。
本文将详细介绍ThinkPHP 中如何使用RedisCluster,包括安装、配置和使用详解等内容。
第一部分:安装RedisCluster在开始使用RedisCluster 之前,我们需要确保RedisCluster 已经安装在开发环境中。
以下是安装RedisCluster 的步骤:1. 下载RedisCluster 扩展:你可以在GitHub 上找到RedisCluster 的源码,并从中获取最新的扩展包。
2. 解压扩展包:将下载的扩展包解压到你的本地文件系统中。
3. 编译扩展包:进入解压后的目录,并执行以下命令进行编译:phpize./configuremake && make install4. 修改php.ini 配置文件:找到你的php.ini 配置文件,并添加以下内容:extension=rediscluster.so5. 重新启动PHP:重启你的Web 服务器或PHP-FPM 进程,以使配置生效。
安装完成后,你可以通过运行`php -m grep rediscluster` 命令来验证RedisCluster 是否已经成功安装。
第二部分:配置RedisCluster在使用ThinkPHP 中的RedisCluster 功能之前,我们需要进行相应的配置。
以下是配置RedisCluster 的步骤:1. 打开ThinkPHP 的配置文件:在你的项目根目录下,找到`config` 目录,并打开`cache.php` 配置文件。
2. 配置RedisCluster 参数:在`cache.php` 文件中,搜索`redis` 配置项,并根据下面的示例进行修改:php'redis' => ['type' => 'redis','host' => '127.0.0.1','port' => 6379,'password' => '','timeout' => 3600,],- `type`:指定使用RedisCluster。
thinkphp6 hasone 实现原理

thinkphp6 hasone 实现原理ThinkPHP6 hasOne 实现原理1. 什么是 hasOne 关联关系•hasOne 是一种关联关系,通常用于描述两个数据模型之间的一对一关系。
•在 ThinkPHP6 中,通过 hasOne 方法可以定义两个模型之间的一对一关联关系,并且可以方便地进行查询和操作。
2. hasOne 关联关系的定义•在 ThinkPHP6 中,我们可以通过在模型类中的hasOne方法来定义关联关系。
•hasOne方法接受两个参数,第一个参数是关联的模型名称,第二个参数是关联的外键字段名。
3. hasOne 关联关系的查询•使用hasOne方法定义好关联关系后,我们可以使用with方法进行关联查询。
•with方法接受一个参数,即要查询的关联模型名称。
•查询结果中会包含主模型和关联模型的数据,并且可以通过关联模型的属性或方法进行访问。
4. hasOne 关联关系的操作•通过定义 hasOne 关联关系,我们可以方便地进行数据的关联操作。
•例如,可以使用save方法来保存关联数据,使用create方法来创建关联数据。
•还可以通过delete方法来删除关联数据,使用update方法来更新关联数据。
5. hasOne 关联关系的原理•在 ThinkPHP6 中,hasOne 关联关系的实现原理主要依赖于模型的关联方法和关联查询方法。
•关联方法会根据关联关系定义生成相应的关联查询对象,而关联查询方法则会根据关联查询对象进行数据库查询。
•在关联查询过程中,ThinkPHP6 会根据关联关系的定义自动进行表关联操作,从而实现一对一关联查询。
6. 总结•hasOne 关联关系是一种常用的关联关系,适用于描述两个模型之间的一对一关系。
•在 ThinkPHP6 中,通过 hasOne 方法可以方便地定义和使用一对一关联关系。
•hasOne 关联关系的实现原理主要依赖于模型的关联方法和关联查询方法,通过自动进行表关联操作实现关联查询。
delphi中thashtable

delphi中thashtable.getstring用法
在Delphi中,THashTable.GetString方法用于获取THashTable 中指定键值对应的字符串值。
具体用法如下:
1. 在使用THashTable之前,你需要在uses子句中添加HashList单元。
2. 创建一个THashTable对象,并使用Add方法添加键值对。
键为字符串类型,值可以为任意类型。
```
var
HashTable: THashTable;
begin
HashTable := THashTable.Create;
HashTable.Add('Key1', 'Value1');
HashTable.Add('Key2', 123);
//...
end;
```
3. 使用GetString方法获取指定键的字符串值。
```
var
ValueStr: string;
begin
ValueStr := HashTable.GetString('Key1');
//...
end;
```
注意事项:
- 如果指定键不存在,GetString方法将返回空字符串。
- 如果指定键对应的值不是字符串类型,GetString方法将报错。
- 如果你想获取其他数据类型的值,你可以使用Get方法,并
进行适当的类型转换。
- THashTable是一个通用的哈希表实现,你可以自定义键和值
的类型,但是GetString方法只能用于字符串类型的值。
EZ Publish模板变量类型详解

EZ Publish模板变量类型详解✓出处:站长百科✓原文地址:/wiki/EZ_Publish/EZ_Publish_模板变量类型✓本电子书整理自站长百科EZ_Publish/EZ_Publish_模板变量类型词条,查看内容请访问网站。
eZ Publish模板语言支持以下变量类型:• 数字• 字符串• 布尔• 数组• 对象某些变量可以直接创建,其它的变量需要通过操作符创建。
数字和字符串可以直接创建。
布尔和数组需要通过操作符创建,对象需要通过各种函数和操作符创建。
此外,也可以创建和使用自定义的变量。
自定义变量必须以对象形式存在。
数字数字可以是正数,0,负整数或浮点数。
下例演示了如何在模板中使用不同的数字:{13}✓出处:站长百科{1986}{3.1415}{102.5}{-1024}{-273.16}字符串字符串可以由单引号或双引号,'或",封装。
如果省略引号,字符串会被解释为函数名。
字符串通常以下面的方法定义:{'This is a string.'}{"This is another string."}输出:This is a string.This is another a string.使用引号字符串内部可以包含引号。
可以通过使用不同类型的引号(例如:在双引号封装的字符串中使用单引号)或通过使用转义符"\":{'The following text is double quoted: "Rock and roll!" '}{"The following text is single quoted: 'Rock and roll!' "}{'Using both single and double quotes: "Rock\'n roll!" '}✓出处:站长百科{'Using both single and double quotes: \'Rock\'n roll!\' '}{"Using both single and double quotes: 'Rock'n roll!' "}{"Using both single and double quotes: \"Rock'n roll\" "}输出:The following text is double quoted: "Rock and roll!"The following text is single quoted: 'Rock and roll!'Using both single and double quotes: "Rock'n roll!"Using both single and double quotes: 'Rock'n roll!'Using both single and double quotes: 'Rock'n roll!'Using both single and double quotes: "Rock'n roll!"因为模板代码的工作方式(用"{"和"}"定义代码块),右侧的大括号"}"也不要用转义符转义。
java哈希表用法
java哈希表用法Java哈希表是一种常用的数据结构,它可以有效地存储和检索数据。
哈希表采用了一种散列函数,可以将数据映射到表中的桶中。
通过这种方式,可以快速定位数据所在的位置,从而提高了查找的效率。
在Java中使用哈希表的方法有很多种,比较常见的有 HashMap Hashtable。
HashMap Hashtable是 Java准库提供的哈希表实现类,都继承自 Map口。
它们之间有两个主要的区别:1. HashMap可以存储空值,Hashtable不可以存储空值。
2. HashMap是非同步的,Hashtable是同步的。
除此之外,它们的使用方法也有所不同。
HashMap的使用方法如下:1.先,需要创建一个HashMap实例,并指定HashMap实例的容量和加载因子,其中容量表示HashMap实例能够容纳的元素数目,而加载因子表示在容量的某个值时,HashMap实例的容量将自动增加一倍。
2.后,通过存入时,key和value的方式将值存入。
在存入时,根据key值,会将value值存入到桶中。
3.可以使用HashMap提供的方法来搜索、更新、删除等操作,比如get(), put(), remove()等。
Hashtable的使用方法如下:1.先,需要创建一个Hashtable实例,并指定Hashtable实例的容量和加载因子。
2.后,通过存入时,key和value的方式将值存入。
需要注意的是,在使用Hashtable时,key和value均不能为空值。
3.可以使用Hashtable提供的方法来搜索、更新、删除等操作,比如get(), put(), remove()等。
Java哈希表有很多优点,例如:1.找效率高,因为可以快速定位需要的数据2.论存储多少数据,查找效率一样,不受存储数据量的影响3.供了高效的存储和检索方式4.存利用率高,因为哈希表没有额外的存储空间然而,哈希表也有一些缺点,例如:1.于哈希函数的不同,可能出现哈希冲突的情况,导致查找效率不理想2.希表不方便对数据进行排序3.希表存储的数据可能会丢失,因为它不支持随机访问以上就是有关Java哈希表用法的介绍。
pit表查找算法
pit表查找算法
PIT(Programming Interpreter Table)查找算法是一种基于哈希表的查找算法,用于在程序中快速查找符号表。
PIT查找算法的基本思想是将符号表中的每个符号映射到一个哈希值,然后使用该哈希值作为索引在哈希表中查找对应的符号。
PIT查找算法的步骤如下:
1. 计算符号的哈希值:将符号作为输入,计算其哈希值。
哈希函数应该将符号映射到一个唯一的整数。
2. 查找符号:使用计算出的哈希值作为索引,在哈希表中查找对应的符号。
如果找到了符号,则返回该符号。
如果没找到,则说明该符号不存在于符号表中。
3. 处理哈希冲突:由于哈希函数可能将不同的符号映射到相同的哈希值,因此可能会出现哈希冲突。
为了解决哈希冲突,可以使用链地址法或开放地址法。
链地址法是将具有相同哈希值的符号链接到一个链表中。
开放地址法是在发生冲突时重新计算哈希值,直到找到一个可用的位置。
4. 插入符号:如果需要在符号表中插入一个新符号,首先计算该符号的哈希值,然后使用相应的处理哈希冲突的方法在哈希表中插入该符号。
PIT查找算法的时间复杂度为O(1),即平均情况下可以在常数时间内完成查找操作。
这是因为哈希表的大小是固定的,并且每个符号的哈希值是唯一的,因此可以在常数时间内完成查找操作。
但是,如果哈希函数设计不当或数据分布不均匀,可能会导致哈希冲突过多,从而影响查找效率。
路由获取参数
路由获取参数在路由中获取参数的方法根据不同的框架和语言而异。
以下是一些常见框架和语言的示例:1. Node.js Express框架:可以通过req.params对象获取路由中的参数。
示例代码:```。
app.get('/user/:id', function(req, res) 。
const userId = req.params.id;。
//...});。
```。
2. Python Flask框架:可以通过route装饰器将路由中的参数作为参数传递给视图函数。
示例代码:```。
def show_user(user_id):。
#...return 'User %d' % user_id。
3. Ruby on Rails框架:可以通过params哈希表获取路由中的参数。
示例代码:```。
# route definition。
get '/user/:id', to: 'users#show'。
# controller action。
def show。
user_id = params[:id]。
#...end。
```。
4. PHP Laravel框架:可以通过路由闭包或控制器方法中的参数获取路由中的参数。
示例代码:```。
// route closure。
Route::get('/user/{id}', function ($id) 。
//...// controller method。
public function show($id) 。
//...}。
进入PHP之热身运动
_- l :■ _一__■_■
进入 — U _● f 1 _■ _ — 、 _ _ ’ 一 ・邓 文 / 科
之热 身运动
P P是生成动态 网页的一种易学易用 的服务器端脚本语言 。 H 随着网络技术的 日趋流行.更多的开发者将 目 光聚焦在 W b的应 e 用上,是不是想快速地进入 P 的开发世界哦?别急,让藐们先 口
舔加进站点.在设计和维护站点的同时,可 以报轻松的加入 P ,
数默 型和童■
P P支持整数、浮点数、字符 串、数组和对象 变 H 量类型通常 由P 运行过程决定,但是类型世可以被殖数 咿 明确的设定 。
1 .数值
使得站点更加具有动态特性。
P 与 MSL 口 yQ 是现在绝佳的W b e 数据库 开发组合。开发者还
以不受限制地获得源码,甚至可以从中加入 自己需要的特色 。 P
# 讧 风括单行注 竹
floWrd 通过我们已经学过 的船讽, el.o l[ 您可以编 写一个最简单 的P P H 程序来输出一个也许是程序世界中最
有名的词语
删T 畦匝 D ^ × Ⅱ "
( 。 1 日m >
在大多数U i 平台G Lnx和微软Wno ̄平台上均可 以运行。 nx I iu  ̄+ idv
P 的语法与 C e l S 咿 ,P r ,A P或者 J P相似 。对于那些对上 S
(e nkl0 rd d 1 o1 ! (H ) / I∞
( > 咖 )
述语言较熟悉的人来说,PP H 太简单了!基本上只需要 3 升钟就 0 可以将P I 的核心语言特点全部掌握。由于P P H 代码能够无障碍地
,? / 一个包音两 元素的数蛆
¥ []J.f rt a0 ? is .
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP中的哈希表在PHP内核中,其中一个很重要的数据结构就是HashTable。
我们常用的数组,在内核中就是用HashTable来实现。
那么,PHP的HashTable是怎么实现的呢?最近在看HashTable 的数据结构,但是算法书籍里面没有具体的实现算法,刚好最近也在阅读PHP的源码,于是参考PHP的HashTable的实现,自己实现了一个简易版的HashTable,总结了一些心得,下面给大家分享一下。
HashTable的介绍哈希表是实现字典操作的一种有效数据结构。
定义简单地说,HashTable(哈希表)就是一种键值对的数据结构。
支持插入,查找,删除等操作。
在一些合理的假设下,在哈希表中的所有操作的时间复杂度是O(1)(对相关证明感兴趣的可以自行查阅)。
实现哈希表的关键在哈希表中,不是使用关键字做下标,而是通过哈希函数计算出key的哈希值作为下标,然后查找/删除时再计算出key的哈希值,从而快速定位元素保存的位置。
在一个哈希表中,不同的关键字可能会计算得到相同的哈希值,这叫做“哈希冲突”,就是处理两个或多个键的哈希值相同的情况。
解决哈希冲突的方法有很多,开放寻址法,拉链法等等。
因此,实现一个好的哈希表的关键就是一个好的哈希函数和处理哈希冲突的方法。
Hash函数判断一个哈希算法的好坏有以下四个定义:∙一致性,等价的键必然产生相等的哈希值;∙高效性,计算简便;∙均匀性,均匀地对所有的键进行哈希。
哈希函数建立了关键值与哈希值的对应关系,即:h = hash_func(key)。
对应关系见下图:设计一个完美的哈希函数就交由专家去做吧,我们只管用已有的较成熟的哈希函数就好了。
PHP内核使用的哈希函数是time33函数,又叫DJBX33A,其实现如下:static inline ulongzend_inline_hash_func(const char *arKey, uintnKeyLength){registerulong hash = 5381;/* variant with the hash unrolled eight times */for (; nKeyLength>= 8; nKeyLength -= 8) {hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;hash = ((hash<< 5) + hash) + *arKey++;}switch (nKeyLength) {case 7: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 6: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 5: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 4: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 3: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 2: hash = ((hash<< 5) + hash) + *arKey++; /* fallthrough... */case 1: hash = ((hash<< 5) + hash) + *arKey++; break;case 0: break;EMPTY_SWITCH_DEFAULT_CASE()}returnhash;}注:函数使用了一个8次循环+switch来实现,是对for循环的优化,减少循环的运行次数,然后在switch里面执行剩下的没有遍历到的元素。
拉链法将所有具有相同哈希值的元素都保存在一条链表中的方法叫拉链法。
查找的时候通过先计算key对应的哈希值,然后根据哈希值找到对应的链表,最后沿着链表顺序查找相应的值。
具体保存后的结构图如下:PHP的HashTable结构简单地介绍了哈希表的数据结构之后,继续看看PHP中是如何实现哈希表的。
PHP内核hashtable的定义:typedefstruct _hashtable {uintnTableSize;uintnTableMask;uintnNumOfElements;ulongnNextFreeElement;Bucket *pInternalPointer;Bucket *pListHead;Bucket *pListTail;Bucket **arBuckets;dtor_func_t pDestructor;zend_bool persistent;unsignedchar nApplyCount;zend_boolbApplyProtection;#if ZEND_DEBUGint inconsistent;#endif} HashTable;∙nTableSize,HashTable的大小,以2的倍数增长∙nTableMask,用在与哈希值做与运算获得该哈希值的索引取值,arBuckets初始化后永远是nTableSize-1∙nNumOfElements,HashTable当前拥有的元素个数,count函数直接返回这个值∙nNextFreeElement,表示数字键值数组中下一个数字索引的位置∙pInternalPointer,内部指针,指向当前成员,用于遍历元素∙pListHead,指向HashTable的第一个元素,也是数组的第一个元素∙pListTail,指向HashTable的最后一个元素,也是数组的最后一个元素。
与上面的指针结合,在遍历数组时非常方便,比如reset和endAPI∙arBuckets,包含bucket组成的双向链表的数组,索引用key的哈希值和nTableMask 做与运算生成∙pDestructor,删除哈希表中的元素使用的析构函数∙persistent,标识内存分配函数,如果是TRUE,则使用操作系统本身的内存分配函数,否则使用PHP的内存分配函数∙nApplyCount,保存当前bucket被递归访问的次数,防止多次递归∙bApplyProtection,标识哈希表是否要使用递归保护,默认是1,要使用举一个哈希与mask结合的例子:例如,”foo”真正的哈希值(使用DJBX33A哈希函数)是193491849。
如果我们现在有64容量的哈希表,我们明显不能使用它作为数组的下标。
取而代之的是通过应用哈希表的mask,然后只取哈希表的低位。
hash | 193491849 |0b1011100010000111001110001001& mask | &63 |& 0b0000000000000000000000111111----------------------------------------------------------------------= index | = 9 | = 0b0000000000000000000000001001因此,在哈希表中,foo是保存在arBuckets中下标为9的bucket向量中。
bucket结构体的定义typedefstruct bucket {ulong h;uintnKeyLength;void *pData;void *pDataPtr;struct bucket *pListNext;struct bucket *pListLast;struct bucket *pNext;struct bucket *pLast;constchar *arKey;} Bucket;∙h,哈希值(或数字键值的key∙nKeyLength,key的长度∙pData,指向数据的指针∙pDataPtr,指针数据∙pListNext,指向HashTable中的arBuckets链表中的下一个元素∙pListLast,指向HashTable中的arBuckets链表中的上一个元素∙pNext,指向具有相同hash值的bucket链表中的下一个元素∙pLast,指向具有相同hash值的bucket链表中的上一个元素∙arKey,key的名称PHP中的HashTable是采用了向量加双向链表的实现方式,向量在arBuckets变量保存,向量包含多个bucket的指针,每个指针指向由多个bucket组成的双向链表,新元素的加入使用前插法,即新元素总是在bucket的第一个位置。
由上面可以看到,PHP的哈希表实现相当复杂。
这是它使用超灵活的数组类型要付出的代价。
HashTable相关API∙zend_hash_init∙zend_hash_add_or_update∙zend_hash_find∙zend_hash_del_key_or_indexzend_hash_init函数执行步骤∙设置哈希表大小∙设置结构体其他成员变量的初始值(包括释放内存用的析构函数pDescructor)详细代码注解点击:zend_hash_init源码注:1、pHashFunction在此处并没有用到,php的哈希函数使用的是内部的zend_inline_hash_func2、zend_hash_init执行之后并没有真正地为arBuckets分配内存和计算出nTableMask的大小,真正分配内存和计算nTableMask是在插入元素时进行CHECK_INIT检查初始化时进行。
zend_hash_add_or_update函数执行步骤∙检查键的长度∙检查初始化∙计算哈希值和下标∙遍历哈希值所在的bucket,如果找到相同的key且值需要更新,则更新数据,否则继续指向bucket的下一个元素,直到指向bucket的最后一个位置∙为新加入的元素分配bucket,设置新的bucket的属性值,然后添加到哈希表中∙如果哈希表空间满了,则重新调整哈希表的大小函数执行流程图CONNECT_TO_BUCKET_DLLIST是将新元素添加到具有相同hash值的bucket链表。