Вероятностное хеширование — является там такой вещью?

Я использовал nginx-full вместо nginx-extras из-за этой самой проблемы. Я бегу 14.10, потому что я хочу Postgres 9.4.

Я продолжал получать кучу странных ошибок, и я случайно продолжал следовать указаниям Пассажира, следуя инструкциям APT. Упс. Поэтому я изначально следовал ответу @ Maciej-adamczewski, но он добавляет пассажирскую установку Debian 7 вместо установки Ubuntu 14.04. Это испортило меня.

Вот что я сделал, чтобы отсортировать меня:

sudo apt-mark showhold  # apparently I had nothing in here
sudo apt-get autoclean
sudo apt-get update && sudo apt-get upgrade
# I hoped upgrade would get rid of that error re: nginx-extras
# it didn't at all, so decided to scrap and start over

sudo apt-get purge nginx*  # to get rid of everything nginx
sudo apt-get remove nginx*  # paranoia
sudo apt-get purge passenger
sudo apt-get remove passenger  # paranoia again
sudo apt-get autoremove

sudo apt-get update
sudo apt-get install nginx-full passenger

Бум! Получил nginx для правильной работы.

Это не говорит о части Digital Ocean, но если вы установили RVM вместо ruby ​​напрямую, вам нужно выяснить, где находится ваш rvm ruby:

rvm use
passenger-config --ruby-command

И затем скопируйте и вставьте информацию nginx с надписью passenger_ruby /usr/local/... и переопределите исходную строку passenger_ruby в вашем файле /etc/nginx/nginx.conf.

Позже, когда вы создаете сайты, убедитесь, что вы добавили в passenger_enabled on; в блоке своего сервера для nginx!

mad props этому чуваку: Настройка рельсов на DO

6
задан Svante 17 June 2009 в 18:48
поделиться

6 ответов

You could probably (ab?)use a bloom filter for something like this.

19
ответ дан 8 December 2019 в 02:53
поделиться

Предполагая, что адреса IPv4, существует пространство поиска 2 32 . Вам нужно не более 1 бита на IP-адрес (0 == без посещения, 1 == посещение). Без учета накладных расходов на хранилище для этого потребуется 512 МБ (2 29 ). Таким образом, в упрощенной реализации будет выделен массив размером 512 МБ (или таблица с 2 29 строками, каждая из которых хранит байт, или 2 27 строк, каждая из которых хранит 32-разрядное целое число, или 2 26 строк, каждая из которых хранит 64-битное целое число, или ...)

Вы можете оптимизировать это для разреженного населения, превратив его в дерево.

Определите размер «страницы» для 2 x бит. Вы будете выделять память для одной страницы за раз.

Разделите пространство поиска (2 32 ) на размер вашей страницы. Это общее количество страниц, необходимых для представления всех возможных адресов в вашем пространстве поиска.

Затем, чтобы определить, есть ли совпадение в вашем хэше, вы сначала определите, присутствует ли страница, и если да, то установлен соответствующий бит на странице. Чтобы кэшировать адрес, вы сначала определите, присутствует ли страница; если нет, вы создадите это. Затем вы установите соответствующий бит.

Это довольно легко преобразуется в таблицу базы данных. Вам понадобится всего два столбца: индекс страницы и двоичный массив. Когда вы выделяете страницу, вы просто сохраняете строку в таблице с правильным индексом страницы и пустым двоичным массивом.

Например, для размера страницы 1024 бит (что дает максимум 2 22 страниц), вы можете структурировать свою таблицу следующим образом:

CREATE TABLE VisitedIPs(
    PageIndex int         NOT NULL PRIMARY KEY,
    PageData  binary(128) NOT NULL
)

Чтобы проверить, посещался ли IP-адрес, вы должны использовать код, похожий на (псевдокод):

uint ip = address.To32Bit();

string sql =
    "SELECT PageData " +
    "FROM VisitedIPs " +
    "WHERE PageIndex = " + (ip >> 10);

byte[] page = (byte[])GetFromDB(sql);

byte b = page[(ip & 0x3FF) >> 3];

bool hasVisited = (b & (1 << (ip & 7)) != 0;

Настройка посещенного IP-адреса аналогична:

uint ip = address.To32Bit();

string sql =
    "SELECT PageData " +
    "FROM VisitedIPs " +
    "WHERE PageIndex = " + (ip >> 10);

byte[] page = (byte[])GetFromDB(sql);

page[(ip & 0x3FF) >> 3] |= (1 << (ip & 7));

sql =
    "UPDATE VisitedIPs " +
    "SET PageData = @pageData " +
    "WHERE PageIndex = " + (ip >> 10);

ExecSQL(sql, new SqlParam("@pageData", page));
6
ответ дан 8 December 2019 в 02:53
поделиться

Все операции хеширования выполняются с потерями в силу принципа сундука . Вы неизбежно пытаетесь втиснуть N вещей в M слотов (где N >> M). Все, что вам нужно сделать, это просто не обрабатывать случаи коллизии и выбрать достаточно большую хеш-таблицу.

4
ответ дан 8 December 2019 в 02:53
поделиться

Sure! Decide how many "bins" you can afford (at one bit each), say N; hash the IP address to a string of bits B; take B modulo N. You can compute the probability of accidental collisions (with some approximation, such as, assume all hashed IP addresses form equally likely bitstrings B) and determine N accordingly if you have a constraint on maximum accidental collision probability that's acceptable for your application.

2
ответ дан 8 December 2019 в 02:53
поделиться

Integer (ipv4) or string (ipv6) hashing without collision handling, using the hash-value (modulo hash table size) as the index to a bitmap-array.

0
ответ дан 8 December 2019 в 02:53
поделиться

Начать усечение битов.

Вероятность хеш-коллизии становится 50%, когда у вас есть 2 ^ (n / 2) элементов из возможных 2 ^ n. IP-адрес - 2 ^ 32, поэтому вероятность столкновения составляет 50%, если в контейнере находится 2 ^ 16 элементов.

Уменьшайте, как вам удобно.

1
ответ дан 8 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: