





В PHP нет практических ограничений на размер строки. Согласно руководство:
Note: It is no problem for a string to become very large. PHP imposes no boundary on the size of a string; the only limit is the available memory of the computer on which PHP is running.
Можно с уверенностью предположить, что это применимо и к использованию строк в качестве ключей в массивах, но в зависимости от того, как PHP обрабатывает поиск, вы можете заметить снижение производительности по мере увеличения строк.
Вроде ограничивается только лимитом памяти скрипта.
Быстрый тест дал мне ключ на 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>";
ой! ну, мне, конечно, не нужно беспокоиться о том, что мои ключи будут немного превышать 255 символов.
Имейте в виду, что PHP может быть не единственным ограничивающим фактором для размера ключа. Например, memcache может обрезать ключи из $ _SESSION, если они слишком длинные.
В 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;
}
Хорошая иллюстрация RoBorg, если у меня будет ключ больше 128mb, я, наверное, попаду на ежедневный WTF. Большое спасибо.