Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的数组冲突_Php_Arrays_Performance_Security - Fatal编程技术网

php中的数组冲突

php中的数组冲突,php,arrays,performance,security,Php,Arrays,Performance,Security,小评论 通过阅读有关变量的内容,我了解了很多PHP处理数组的内部结构。这不是一个真正的问题,而是“为什么我们真的需要这个max\u input\u var”。它不是本地化的,实际上与许多其他编程语言相关,而不仅仅是php 问题: 比较这两个小型php脚本: $data = array(); for ($key = 0; $key <= 1073709056; $key += 32767){ $data[$key] = 0; } $data=array(); 对于($key=0;$

小评论

通过阅读有关变量的内容,我了解了很多PHP处理数组的内部结构。这不是一个真正的问题,而是“为什么我们真的需要这个max\u input\u var”。它不是本地化的,实际上与许多其他编程语言相关,而不仅仅是php

问题:

比较这两个小型php脚本:

$data = array();
for ($key = 0; $key <= 1073709056; $key += 32767){
    $data[$key] = 0;
}
$data=array();

对于($key=0;$key我对php不太了解,但32767将是2字节数字的最大值。将其增加到32768将使用3字节数字(从未使用过,因此将为4字节)这是必要的,这反过来会使一切变慢。

问题不在循环中,问题在于PHP和许多其他语言(Java、Python、ASP.Net)如何在哈希数据结构中存储键/值对。PHP使用哈希表存储数组(从理论上讲,这使它们能够非常快速地从该数组存储和检索数据。
O(1)
)。当多个值映射到同一个键时,就会出现问题,从而产生哈希冲突。将元素插入这样一个键会变得更加昂贵
O(n)
,因此插入n个键会从O(n)跳到O(n^2)

这正是这里发生的。当数字从
32767
变为
32768
时,它会将键从无冲突变为所有冲突都是同一个键

这种情况是这样的,因为它在C中实现php数组的方式。数组的大小是2的幂。(包含
9
15
元素的数组将与包含
16
大小的数组一起分配)。此外,如果数组键是整数,则散列将是一个整数,上面有一个掩码。掩码是二进制数组的大小-1
。这意味着,如果有人试图在关联数组中插入以下键
0、32、64、128、256,
等,则它们都将映射到同一个键,因此散列将我会有一个链表。上面的例子就是这样创建的

这需要大量的CPU来处理,因此您会看到大量的时间增长。这意味着,开发人员在接受来自外部的数据时,应该非常小心,因为这些数据将被解析到数组中(人们可以轻松地制作数据并对服务器进行操作)。这些数据可以是
$\u GET
$\u POST
请求(这就是为什么您可以使用
max\u input\u vars
)、
XML
JSON
来限制数字

以下是我用来学习这些知识的资源:


不,这不是正确答案。如果您将使用32769运行它(将您置于相同的
3字节编号中
)也会非常快。因此这个答案是错误的。我正在完成正确的答案,几分钟后它就会在这里。嗯,这让我很惊讶,期待着你的正确答案。我写道,差异在$key旁边的数字。数字相差1。
$data = array();
for ($key = 0; $key <= 1073709056; $key += 32768){
    $data[$key] = 0;
}