Требуется много времени, чтобы выяснить, что привело к сбою в работе моего сайта при переходе на лучшую подписку на хостинг.Как бороться с целым максимальным разницей между 32-битными и 64-битными серверами?
Я использую «самодельный» уникальный уникальный генератор для генерации всего, что должно быть уникальным, но эта уникальность не случайна. Я использую это для связи между несколькими службами, генерируя воспроизводимые уникальные «числа» для файлов, статей и т. Д.
Это функция, которую я создал и никогда не имел проблем с (я думаю, что она никогда не работает на 64-битной системе раньше?) Для создания уникального идентификатора. Я знаю, что эта уникальность ограничена (64 000), но до сих пор не приводит к проблеме.
function suGetHashCode($s)
{
$hash=0;
$c=(is_string($s))?strlen($s):0;
$i=0;
while($i<$c)
{
$hash = (($hash << 5)-$hash)+ord($s{$i++});
//hash = hash & hash; // Convert to 32bit integer
}
return ($hash < 0)?(($hash*-1)+0xFFFFFFFF):$hash; // convert to unsigned int
}
function suUniqueId($s, $bAddLen = false)
{
$i = base_convert(suGetHashCode($s), 10, 32);
if($bAddLen && is_string($s))
{ $i.=('-'.suGetLz(dechex(strlen($s)*4), 3)); }
return $i;
}
function suGetLz($i, $iMaxLen) // Leading zero
{
if(!is_numeric($i) || $i < 0 || $iMaxLen <= 0)
{ return $i; }
$c = strlen($i);
while($c < $iMaxLen)
{ $c++; $i='0'.$i; }
return $i;
}
Максимальное ИНТ значение целого числа на новой системе:
PHP_INT_MAX = 9223372036854775807
На другой системе (ах) это:
PHP_INT_MAX = 2147483647
Ну, я не математика человек, я думаю, что это вызывает проблему из-за приращения 0xFFFFFFFF, когда отрицательный (я думаю, что он никогда не будет отрицательным в этой новой системе).
Но как я могу изменить функцию, которая создает тот же уникальный идентификатор, что и на других системах?
Например: Он производит один и тот же идентификатор для различных строк на новый хостинг-сервер:
$sThisUrl = '<censored>';
var_dump(suUniqueId($sThisUrl)); // Produce: 1l5kc37uicb
$sThisUrl = '<censored>';
var_dump(suUniqueId($sThisUrl)); // Produce the same id as above: 1l5kc37uicb
Но это должно быть, как на старых системах:
$sThisUrl = '<censored>';
var_dump(suUniqueId($sThisUrl)); // Produce: a46q6nd
$sThisUrl = '<censored>';
var_dump(suUniqueId($sThisUrl)); // Produce: 2mirj1h
Извещение: строка разделяется на части, чтобы избежать переполнения stackoverflow, см. ссылку.
EDIT: Удалены имена файлов
ли кто-нибудь, как справиться с этой проблемой?
Нет смысла говорить «отредактировать: удалить X», потому что он просто обращает внимание на исходное сообщение http://stackoverflow.com/revisions/19214266/1 –
В некотором роде вы правы, но все в порядке, поставьте два разных длинных URL-адреса в примере, и вы увидите, что он дает те же результаты, когда на 64-битной. – Codebeat
Вы не можете легко вернуть материал, который вы разместили под лицензией cc-by-sa. Редактирование вопроса сделает его менее заметным, но вопрос в его первоначальной форме больше не является вашей исключительной собственностью. Кроме того, удаление строк затрудняет воспроизведение этой проблемы другими. И поскольку у немногих людей есть 32-битные и 64-битные установки PHP под рукой, это значительно снижает шансы на сравнение. – MvG