Я генерирую ассоциативные массивы, а ключевое значение представляет собой строку concat столбцов 1..n.
Есть ли максимальная длина для ключей, которые вернутся, чтобы укусить меня? Если это так, я, вероятно, остановлюсь и сделаю это по-другому.
Я генерирую ассоциативные массивы, а ключевое значение представляет собой строку concat столбцов 1..n.
Есть ли максимальная длина для ключей, которые вернутся, чтобы укусить меня? Если это так, я, вероятно, остановлюсь и сделаю это по-другому.
Он, по-видимому, ограничен только предел памяти script.
Быстрый тест дал мне ключ 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;
}