Номера, которые могли вернуться
У каждого счётчика здесь есть номер. Он стоит в коде вставки, в адресе статистики и на стольких страницах, на скольких владелец его разместил. Номера выдаются так: берётся случайный между 100 и 9 999 999 999, и проверяется, не занят ли он.
Проверяется одна таблица.
Та, другая таблица
Счётчики, давно не фиксировавшие посещений, переносятся в таблицу архива. Это обычная уборка — она держит рабочую таблицу маленькой, а запросы к ней быстрыми. 24 августа 2026 года в архиве лежало 212 771 номеров, и ни одного из них не было в таблице, которую проверяет генератор.
Значит, каждый из них мог быть выдан заново.
Против десяти миллиардов возможных номеров это примерно два процента столкновений: примерно один из пятидесяти новых счётчиков получил бы номер, принадлежавший кому-то другому. И это не абстрактные столкновения. Счётчик попадает в архив именно потому, что его страница затихла — но затихшая страница не обязательно удалённая. Если старая вставка всё ещё стоит в какой-нибудь забытой боковой колонке и эта страница получает посетителя, посещение попадает в чужую статистику, на счётчик, созданный годы спустя.
У нас нет способа установить, случилось ли это уже. Ничто не отличает посещение, пришедшее этим путём, от любого другого.
Два изменения
Генератор теперь проверяет обе таблицы. А удаление счётчика — которое с того же дня владелец может выполнить сам — оставляет надгробие: строку, состоящую из одного лишь номера, чтобы он никогда не был выдан повторно. Удаление убирает в одной транзакции данные из двадцати таблиц и не сохраняет копии, в чём и весь смысл удаления; номер — единственное, что должно остаться сожжённым.
Почему это осталось незамеченным
Генератор писался, когда таблица была одна. Архив появился позже, по другой причине, решая другую задачу, и ничто не связало эти две мысли. Обе части были по отдельности верны.
Такую форму имеет большинство подобных случаев. Не ошибка, которую кто-то допустил в конкретном месте, а следствие, увидеть которое никто не стоял в подходящей точке. Единственная защита — идти искать нарочно, и вопрос, нашедший этот случай, был вполне обыкновенным: прежде чем строить удаление — где ещё живёт номер счётчика?