Din idé om at hash lange strenge for at skabe et token, som du kan slå efter i en butik (cache eller database) er god. Jeg har set dette gjort for ekstremt store strenge og i miljøer med høj lydstyrke, og det fungerer fantastisk.
"Hvilken hash ville du bruge til denne applikation?"
- Jeg tror ikke, at krypterings (hashing) algoritmen virkelig betyder noget, da du ikke hash for at kryptere data, du hash for at skabe et token, som du kan bruge som en nøgle til at slå længere værdier op. Så valget af hashing-algoritme bør baseres på hastighed.
"Vil du beregne hashen i kode eller lade db'en håndtere det?"
- Hvis det var mit projekt, ville jeg lave hashing på applaget og derefter sende det igennem for at slå op i butikken (cache og derefter database).
"Er der en radikalt anderledes tilgang til at gemme/søge lange strenge i en database?"
- Som jeg nævnte, tror jeg, at din foreslåede løsning til dit specifikke formål er god.
Tabelanbefalinger (kun demonstrative):
user
- id int(11) unsigned not null
- navn_første varchar(100) ikke null
user_agent_history
user_id
int(11) unsigned not nullagent_hash
varchar(255) ikke null
agent
agent_hash
varchar(255) ikke nullbrowser
varchar(100) ikke nullagent
tekst ikke null
Et par bemærkninger om skema:
-
Fra din OP lyder det som om du har brug for et M:M forhold mellem bruger og agent, på grund af det faktum, at en bruger muligvis bruger Firefox fra arbejde, men så kan skifte til IE9 derhjemme. Derfor behovet for pivottabellen.
-
Varchar(255) brugt til
agent_hash
er til debat. MySQL foreslår ved hjælp af en varbinær kolonnetype til lagring af hashes, som der er flere typer af. -
Jeg vil også foreslå enten at lave
agent_hash
en primær nøgle, eller i det mindste tilføje en UNIK begrænsning til kolonnen.