ScenarioChe cos'è un buon algoritmo per verificare se un numero esiste in più set senza cercarli tutti?
Diciamo che dispone di più database in 3 zone. Zona A
, B
e C
. Ogni zona in diversa posizione geografica. Allo stesso tempo, hai un'applicazione che instraderà nome utente e password in base alla posizione geografica dell'utente. Ad esempio, l'utente A
verrà reindirizzato al database nella zona A
. Utente B
Zona B
e così via.
Ora, diciamo che l'utente A
si sposta in una zona B
. La zona di domanda dell'applicazione B
e non troverà nulla. La zona di interrogazione A
e la zona C
potrebbero impiegare un po 'di tempo a causa di zone molto lontane e dovranno interrogare tutti i database in tutte le zone.
La mia domanda
modo è possibile verificare se una stringa/numero esiste in più set?
o
Come si può verificare una riga esiste nel database prima anche l'invio di una query?
mio algoritmo
Questo non è perfetto, ma vi darà qualche idea di quello che sto cercando di fare
Se abbiamo la base di dati con i seguenti 3 utenti
- foo
- bar
- foobar
Prendiamo l'hash di tutti e 3 gli utenti e cerchiamo il prossimo numero primo se l'hash non è primo.
sum = hash(foo).nextPrime() * hash(bar).nextPrime() * hash(foobar).nextPrime()
Quella somma è condivisa tra tutte le zone. Se voglio controllare lo foo
, posso semplicemente prendere l'hash di foo, e cercare il prossimo primo, quindi prendere lo gcd(foo,sum)
. Se non è uguale a uno. Significa che foo esiste in qualche database. Se è uguale a uno, significa che foo non esiste affatto. Se voglio aggiungere un nuovo nome utente. Posso semplicemente fare sum = sum * hash(newUserName).nextPrime().
Sum crescerà fino a un punto che sarà più veloce per interrogare tutti i database.
Conosci un algoritmo simile per risolvere questo problema?
Considerare l'utilizzo di un filtro Bloom http://en.wikipedia.org/wiki/Bloom_filter – samgak
@samgak, è esattamente quello che sto cercando. Se pubblichi una buona spiegazione all'algoritmo, contrassegnerò la tua risposta come corretta. – Ahmed