Я не думаю, что какой-либо из пакетов DBM имеет API для получения случайного ключа или для получения ключей по номеру индекса. Вы можете найти конкретный ключ или прочитать все ключи в любом порядке, в котором база данных решит их вернуть (что может измениться, если база данных изменена, и может быть или не быть «случайным» достаточно для того, что вы хотите делать).
Вы можете прочитать все ключи и выбрать один, но для этого потребуется каждый раз читать всю базу данных (или, по крайней мере, значительную ее часть), и это, вероятно, слишком медленно.
Я думаю, вам нужно изменить структуру данных.
Вы можете использовать реальную базу данных SQL
(например, SQLite ), чтобы вы могли
искать строки как последовательно
номер строки и по URL. Это будет
будь самым гибким.
Вы можете использовать последовательное целое число
в качестве ключа для вашего файла DBM. Тот
сделает выбор случайным
легко, но ты больше не можешь смотреть
вверх записи по URL.
Вы можете использовать два файла DBM: тот, который у вас есть сейчас, и второй, снабженный последовательным целым числом с URL-адресом в качестве значения. (На самом деле, поскольку URL-адреса не выглядят как целые числа, вы можете хранить оба набора записей в одном и том же файле DBM, но это усложнит любой код, использующий each
.) Это потребует вдвое больше дискового пространства и приведет к вставке / удаление записей немного сложнее. Вам, вероятно, будет лучше с подходом № 1, если вы по какой-то причине не можете установить SQLite.