All streams
Search
Write a publication
Pull to refresh
41
0
Спартак @Assorium

Пользователь

Send message
Есть алфавит, к примеру '01234567890abcdef'
И вместо 1 производится инкремент по алфавиту. Т.е. если стоял символ 'b' после инкремента будет символ 'c', декремент (во время удаления) все делает наоборот.

Это не самое лучшее решение. У меня было другое, где значения отделялись знаком, к примеру запятой. Но оно было очень медленным.
Ну тут разницы нет. Конвертирование никто не отменял. Другое дело, что с большими числами напрямую не поработать, поэтому crc32 мне здорово помог. Я пробовал различные манипуляции с разными хешами и лучшей уникальности/производительности добиться не смог.
Вы что, я бы не стал оставлять, если бы он возвращал число. Для меня была целая проблема найти хоть что-то хеширующее и возвращающее число.

Из Википедии
The current version is MurmurHash3 which yields a 32-bit or 128-bit hash value.
Кстати, рост памяти во время проверки только из-за наполнения массива ошибок. Его размер равен половине размера выборки. Без него Bloom потребляет почти ничего.

Скорость не проверял, хотя уверен, что работает гораздо быстрее. Уникальность на уровне 62-64%. Есть подозрение, что это из-за использования crc32 в качестве преобразования строка -> число.
Вот код теста.

<?
$num = 2000;
$string = "some long string to test murmur unique";

$ar = array();
for($i=0; $i<$num; $i++) {
  $ar[ abs( crc32( murmurhash3($string, rand(0, $num*60))  ) ) % $num ] = 1;
}

echo array_sum($ar)/$num, PHP_EOL;
?>


Вообще не вижу смысла использовать, даже если работает быстрее, т.к. тогда уже лучше использовать расширение фильтра Блума написанное на C. Но как дополнительный вариант можно добавить.
Я думал об этом. Как минимум памяти это съест гораздо больше. А вот о возможности задавать в виде ключа строку различных кодировок я не уверен. Разве что и там хеширование использовать.
В общем, я проверю.
Да, можно. Под рукой был только Windows, поэтому было невозможно его проверить. Скоро выложу информацию.
Они с русской страницы этой же статьи :)
Ну это логично.

\textstyle k = \frac{m}{n}\ln 2 \approx 0.6931 \frac{m}{n},
2^{-k} \approx {0.6185}^{m/n}.

Тем более примеры потребления памяти в тексте приведены. Я просто не совсем понял, что конкретно имел в виду Igorbek
Поправьте, если я чего-то не понял.
Количество хеш-функций определяется из 2-х условий: количества объектов в выборке и вероятности «ложноположительного» срабатывания. Mrrl прав. Число хеш-функций крайне мало по сравнению с количеством объектов. И основную память занимает как раз битовая строка.

Хеш функция приведена в тексте:
 abs( crc32( md5($this->seed[0] . $string) ) ) % $size;
Можете пояснить эту конструкцию?
if ($this->isNegative()) {
	// 14 is the magic precision number
	$number = bcadd($number, '0', 14);
	if ('.00000000000000' !== substr($number, -15)) {
		$number = bcsub($number, '1', 0);
	}
}
Тут уже встает вопрос насколько такой кэш подходит Вашему приложению. Если select/total > 90%, я считаю эту стратегию верной и самой простой.

Поясните, чем плох дроп кеша, даже массовый (в пределах тега)?

Менять префиксы не самый лучший способ. Их необходимо где-то хранить. Также некоторые системы при перезаполнении пула, могут просто отказаться работать (старые версии APC, к примеру).

Другой вариант, это бэкграундое перестроение кеша. Когда Вы заранее знаете, что Вы храните и перестраиваете по затронутым тэгам, а пока кеш не перестроен, отдаете старый контент.
Это скорее ответ не Вам, а gandjustas.

Пример, кеширование запросов в БД через ORM. В большей части ORM есть модели, к модели можно привязать определенные префикс. Модель выполняет разнообразные запросы с различными параметрами и все отправляет в кэш со своим префиксом.

Когда наступает момент изменения данных в БД, касающихся определенной модели, мы точно не знаем, какие именно кеши эти данные затронули и сбрасываем кеши объединенные префиксом или тэгом. Многие системы позволяют искать по префиксу (главное, чтобы он был уникальный и не затрагивал лишних данных).

Но, к примеру Memcached не позволяет, поэтому я лично знаю костыль, когда дополнительно используется noSQL решение в добавок Memcached для хранения ключей по тегам.

Реализацию с БД привел только как абстрактный пример.
Давно придумали тэгирование. И очистку кеша по тэгу.
Тебе просто нужно было жирным выделить 90-100.
Как мило у Вас задаются регионы поиска.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity