Каков максимальный размер ключа для массива в PHP? - PullRequest
65 голосов
/ 22 января 2009

Я генерирую ассоциативные массивы, а значение ключа представляет собой строку concat из 1..n столбцов.

Есть ли максимальная длина для ключей, которые вернутся, чтобы укусить меня? Если так, я, вероятно, остановлюсь и сделаю это по-другому.

Ответы [ 3 ]

79 голосов
/ 22 января 2009

Кажется, он ограничен только пределом памяти скрипта.

Быстрый тест дал мне ключ 128 Мб без проблем:

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>";
16 голосов
/ 22 января 2009

Нет практического ограничения на размер строки в PHP. Согласно инструкции :

Примечание: для строки нет проблем стать очень большим. PHP не навязывает граница по размеру строки; единственным ограничением является доступная память компьютер, на котором работает PHP.

Можно с уверенностью предположить, что это применимо и к использованию строк в качестве ключей в массивах, но в зависимости от того, как PHP обрабатывает свои запросы, вы можете заметить снижение производительности, когда строки становятся больше.

5 голосов
/ 26 марта 2014

В 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;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...