我正在生成关联数组,键值是1..n列的字符串concat。
钥匙的最大长度是否会让我咬伤?如果是这样,我可能会停下来做不同的事情。
答案 0 :(得分:79)
它似乎仅限于脚本的内存限制。
快速测试给我一个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>";
答案 1 :(得分:16)
PHP中的字符串大小没有实际限制。根据{{3}}:
注意:字符串没有问题 变得非常大。 PHP没有 字符串大小的边界;该 唯一的限制是可用的内存 正在运行PHP的计算机。
可以安全地假设这也适用于在数组中使用字符串作为键,但是根据PHP处理其查找的方式,当字符串变大时,您可能会注意到性能下降。
答案 2 :(得分: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;
}