Каков максимальный размер ключа для массива в PHP?

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

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

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

Быстрый тест дал мне ключ от 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>"; 

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

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

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

В 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; }