PHP中数组的最大键大小是多少?


69

我正在生成关联数组,并且键值是1..n列的字符串连接。

有最大长度的钥匙会再次咬我吗?如果是这样,我可能会停下来,并做不同的事情。


2
很好的插图RoBorg,如果我的密钥超过128mb,我可能会发现自己每天使用WTF。非常感谢。
罗斯,

Answers:


85

它似乎仅受脚本的内存限制的限制。

快速测试使我获得了128mb的密钥,没问题:

ini_set('memory_limit', '1024M');

$key = str_repeat('x', 1024 * 1024 * 128);

$foo = array($key => $key);

echo strlen(key($foo)) . "<br>";
echo strlen($foo[$key]) . "<br>";

12
y!好吧,我当然不必担心我的密钥会略超过255个字符。
thomasrutter,2009年

6
请记住,PHP可能不是唯一限制密钥大小的因素。例如,memcache如果它们太长,可以从$ _SESSION截断密钥。
jchook

17

在PHP中,对字符串大小没有实际限制。根据手册

注意:字符串变大没有问题。PHP对字符串的大小没有限制;唯一的限制是运行PHP的计算机的可用内存。

可以肯定地说这也适用于将字符串用作数组中的键,但是根据PHP处理其查找方式的不同,随着字符串变大,您可能会注意到性能下降。


5

在zend_hash.h中,您可以找到zend_inline_hash_func()可以显示如何在PHP中对密钥字符串进行哈希处理的方法,因此,请使用字符串长度小于8个字符的密钥来提高性能。

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength) {

register ulong 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()
}
    return hash;   
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.