2010-11-11 16 views
1

Je développe un site Web où un utilisateur peut rechercher quelque chose près de leur où ils entrent (au Royaume-Uni). Il peut y avoir jusqu'à 10+ résultats correspondants, mais le client veut seulement que 3 résultats soient affichés à la fois. Parce que chaque 'quelque chose' paye le même montant à énumérer, chaque 'quelque chose' devrait avoir la même chance d'être affiché ... et ces résultats ne devraient pas changer chaque fois qu'un même utilisateur fait la recherche.Quelle est la meilleure manière de montrer les mêmes résultats à un utilisateur basé sur leur code postal?

I Je pense utiliser le code postal de l'utilisateur comme une graine, et sélectionner au hasard 3 résultats sur la liste correspondante. Serait-ce un bon moyen d'y parvenir? Quelles sont mes autres options?

+0

J'utiliserais probablement quelque chose de plus unique à l'utilisateur que le code postal, surtout si vous avez des plans internationaux. Les codes postaux américains sont énormes. –

+0

il sera juste pour le Royaume-Uni – davivid

Répondre

1

Vous pouvez utiliser les deux derniers octets de l'adresse IP qui a initié la requête en tant que graine aléatoire. Cela vous donnerait 65 536 valeurs de graines possibles réparties de façon assez uniforme. Je voudrais ensuite leur renvoyer leur adresse IP dans un cookie au cas où ils se connectent via un réseau qui randomise l'adresse externe à partir de laquelle ils se connectent. Vous utiliseriez la valeur du cookie s'il était présent, sinon utilisez leur adresse réelle.

Je dis les deux derniers octets au lieu des deux premiers, car l'utilisation des deux premiers provoquera, par ex. tous les utilisateurs d'un même FAI local doivent recevoir les mêmes résultats, et je m'attends à ce que les deux derniers octets soient distribués de manière beaucoup plus homogène par vos utilisateurs.

Notez que, par ex. les entreprises ou les universités qui acheminent tout le trafic à travers une adresse, tous les utilisateurs de cette institution verront les mêmes résultats avec cette approche.

Si vous n'êtes pas défavorable à l'idée de cookies, définissez un cookie qui se renouvelle à chaque visite, d'un an environ, contenant environ 64 bits de déchets aléatoires. Ensuite, utilisez cela comme votre graine.

+0

Vous pouvez toujours ajouter plus de données à une graine: si votre PRNG ne prend que 16 bits de données de graine, vous pouvez utiliser les 16 derniers bits d'un hachage de l'adresse IP complète. –

+0

C'est une bonne idée merci, bien que si l'utilisateur arrive à répéter la recherche à un autre endroit, mais pour l'adresse de leur maison, ils n'auront pas le même résultat. En outre, si vous passez par une adresse IP, cela peut donner un avantage injuste à une liste particulière. – davivid

+0

@davivid: En quoi cela serait-il différent de se déplacer vers un code postal différent et de chercher à partir de là? – cdhowie

1

Si vous voulez que les éléments qu'ils affichent soient aléatoires, pourquoi ne pas simplement utiliser le rand function de PHP pour générer une graine aléatoire? Une fois que leur graine a été générée, vous pouvez enregistrer un cookie avec la valeur. Lors du chargement de la page, vérifiez si le cookie existe. Si c'est le cas, utilisez la valeur dans le cookie; Si ce n'est pas le cas, régénérez le nombre aléatoire et créez un nouveau cookie. Cela ne fonctionnerait pas si l'utilisateur efface ses cookies chaque fois qu'il ferme le navigateur, mais la plupart des gens ne le font pas.