Допустим, у вас есть несколько баз данных в 3 зонах. Зона A
, B
и C
. Каждая зона в разных географических точках. В то же время у вас есть приложение, которое будет маршрутизировать имя пользователя и пароль на основе географического местоположения пользователя. Например, пользователь A
будет перенаправлен в базу данных в Зоне A
. Пользователь B
Зона B
и так далее.
Теперь, скажем, пользователь A
переходит в зону B
. Зона запроса приложения B
и ничего не найдет. Зона запроса A
и зона C
могут занять некоторое время из-за того, что зоны находятся далеко, и вам придется запрашивать все базы данных во всех зонах.
Мой вопрос
Как вы можете проверить, если строка/число существует в нескольких наборах?
или
Как вы можете проверить строку существует в базе данных еще до отправки запроса?
Мой алгоритм
Это не идеально, но даст вам некоторое представление о том, что я пытаюсь сделать
Если мы имеем базу данных со следующими 3-х пользователей
- foo
- бар
- foobar
Мы принимаем хеш всех трех пользователей и ищем следующее простое число, если хеш не является простым.
sum = hash(foo).nextPrime() * hash(bar).nextPrime() * hash(foobar).nextPrime()
Эта сумма разделяется между всеми зонами. Если я хочу проверить foo
, я могу просто взять хэш foo и искать следующее правое, а затем взять gcd(foo,sum)
. Если он не равен одному. Это означает, что foo существует в некоторой базе данных. Если он равен единице, значит, foo вообще не существует. Если я хочу добавить новое имя пользователя. Я могу просто сделать sum = sum * hash(newUserName).nextPrime().
Сумма будет расти до такой степени, что будет быстрее запрашивать все базы данных.
Вы знакомы с аналогичным алгоритмом для решения этой проблемы?
Рассмотрите возможность использования фильтра Bloom http://en.wikipedia.org/wiki/Bloom_filter – samgak
@samgak, Это именно то, что я ищу. Если вы опубликуете хорошее объяснение алгоритму, я помечаю ваш ответ как правильный. – Ahmed