70

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

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

4

3 回答 3

90

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

快速测试让我得到了 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>";
于 2009-01-21T21:55:07.607 回答
17

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

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

可以安全地假设这也适用于将字符串用作数组中的键,但是根据 PHP 处理其查找的方式,您可能会注意到字符串变大时性能会受到影响。

于 2009-01-21T21:53:08.953 回答
6

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

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;   
}
于 2014-03-26T02:54:17.867 回答