Comment générer des UUID «sans danger pour les langues»?

20

J'ai toujours voulu utiliser des chaînes générées aléatoirement pour les ID de mes ressources, donc je pouvais avoir des URL plus courtes comme ceci: / user / 4jz0k1

Mais je ne l'ai jamais fait, car j'étais préoccupé par la génération aléatoire de chaînes créant des mots réels, par exemple: / user / f * cker. Cela pose deux problèmes: cela peut être déroutant ou même offensant pour les utilisateurs, et cela peut aussi perturber le référencement.

Ensuite, j'ai pensé que tout ce que j'avais à faire était de mettre en place un modèle fixe comme l'ajout d'un nombre toutes les 2 lettres. J'étais très satisfait de ma méthode 'generate_safe_uuid', mais je me suis alors rendu compte qu'elle était seulement meilleure pour le référencement et pire pour les utilisateurs, car elle augmentait le rapport des mots réels générés, par exemple: / user / g4yd1ck5

Maintenant, je pense que je pourrais créer une méthode 'replace_numbers_with_letters', et vérifier qu'elle n'a pas formé de mots contre un dictionnaire ou quelque chose.

D'autres idées?

ps. En écrivant ceci, je me suis également rendu compte que la recherche de mots dans plus d'une langue (par exemple: anglais et français, espagnol, etc.) serait un gâchis, et je recommence à aimer les identifiants uniquement numériques.

MISE À JOUR

Quelques liens que tout le monde devrait lire:

http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx

HappyDeveloper
la source
Utilisez un hachage ou une somme de contrôle? Si vous préférez utiliser une chaîne aléatoire, il n'y a aucune règle selon laquelle vous devez utiliser chaque lettre de l'alphabet.
Austin Henley
21
Ne l'appelez pas uuid, uuid sont des identifiants universellement uniques. Il s'agit d'un système spécifique d'identifiants que vous pouvez utiliser. Ce n'est pas ce que vous faites ici, alors n'utilisez pas ce terme.
Winston Ewert
4
Je vais juste vous laisser avec l'histoire du générateur automatique de malédictions
Scott Chamberlain
1
@HappyDeveloper, tout d'abord, ce n'est pas universel. Elle est spécifique à votre application. Deuxièmement, uuid fait spécifiquement référence à en.wikipedia.org/wiki/Universally_unique_identifier et non à un schéma similaire que vous concevez.
Winston Ewert
2
C'est un incroyable gaspillage de braintime. Les chances que cela se produise réellement sont bien trop faibles pour mériter même qu'on y pense ...
Michael Borgwardt

Réponses:

6

Quelques conseils qui réduiront les chances de créer des mots significatifs par inadvertance:

  • Ajoutez des caractères non alpha et non numériques au mélange, tels que "-", "!" ou "_".
  • Composez vos UUID en accumulant des séquences de caractères (plutôt que des caractères uniques) qui ne se produiront probablement pas en mots réels, tels que "zx" ou "aa".

Voici un exemple de code C # (en utilisant .NET 4):

private string MakeRandomString()  
{  
    var bits = new List<string>()  
    {  
            "a",  
            "b",  
            "c",  
            "d",  
            "e",  
            //keep going with letters.  
            "0",  
            "1",  
            "2",  
            "3",  
            //keep going with numbers.  
            "-",  
            "!",  
            "_",  
            //add some more non-alpha, non-numeric characters.  
            "zx",  
            "aa",  
            "kq",  
            "jr",  
            "yq",  
            //add some more odd combinations to the mix.  
    };  

    StringBuilder sb = new StringBuilder();  
    Random r = new Random();  
    for (int i = 0; i < 8; i++)  
    {  
        sb.Append(bits[r.Next(bits.Count)]);  
    }  

    return sb.ToString();  
}  

Cela ne garantit pas que vous n'offenserez personne, mais je suis d'accord avec @DeadMG que vous ne pouvez pas viser si haut.

CesarGon
la source
1
Le problème avec les caractères non alphanumériques est que certains d'entre eux ne joueront pas bien dans les URI (conduisant à un caractère échappé, qui sont un gros non-non dans une petite URL: il y a une raison pour que bit.ly et tinyurl ne les utilisent pas). L'autre problème est qu'ils sont moins intuitifs pour l'utilisateur: ils ne sont pas faciles, par exemple, à écrire sur un post-it ou à transmettre par téléphone (de nombreux non-techniciens n'ont aucune idée du nom du trait de soulignement, par exemple). exemple). Encore une fois, il y a une raison pour laquelle les minuscules URL et bit.ly ne les utilisent pas.
user988052
@ user988052: D'où quelques caractères non alpha, non numériques. Il est facile d'en sélectionner quelques-uns qui conviennent aux URI et assez faciles aux humains.
CesarGon
"D'où quelques caractères non alpha, non numériques." [sic] ... Les services de raccourcissement d'URL (bit.ly, tinyurl, t.co, goo.gl, etc.) semblent penser que zéro non alphanum est meilleur que "certains". Et je pense que les raisons que j'ai expliquées dans mes commentaires précédents font partie des raisons pour lesquelles ces services ne sont pas d'accord avec votre point de vue. Maintenant, évidemment, nos opinions divergent sur la question et je vous laisse le dernier mot; )
user988052
@ user988052: J'utilise goo.gl depuis des lustres et il n'y a jamais eu de problème avec la conversion de toutes sortes de caractères non alpha; la seule exception étant%. Vous pouvez trouver cela documenté dans le groupe de discussion du service. Pouvez-vous fournir une référence étayant vos réclamations?
CesarGon
1
OP a déclaré qu'il voulait des noms courts et demande une méthode pour les générer. Vous proposez "d'ajouter des fils non alpha, non numériques au mélange" [sic]. Alors, que proposez-vous? Cet OP génère d'abord "quelque chose" et l'envoie ensuite à tinyurl / bit.ly? Je pense que ce n'est pas ce que OP recherche. OP veut générer directement une URL qui est relativement "minuscule". Tout ce que je dis, c'est que si c'est ce qu'il cherche, il vaut peut-être mieux qu'il utilise un alphabet alphanum, tout comme le fait tinyurl / bit.ly! Maintenant je pars vraiment.
user988052
5

Créez simplement une liste de mots coquins, une liste de substitution de lettres, puis si un ID généré est un mot méchant, refaites-le.

Par exemple (pseudo code)

naughty_words = ["ass", "shit", "boobs"]
substitutions = {
    "4" : "a"
    "1" : "i"
    "3" : "e"
    "7" : "t"
    "5" : "s"
    "0" : "o"
    // etc.
}

function reducestring (str) {
    newstr = ""
    for (character in str) {
        if (substitituions[character]) newstr += substitutions[character]
        else newstr += character
    }
    return tolower(newstr)
}

do {
    new_id_numeric = random_number()
    short_id = compress_to_alphanumeric(new_id_numeric) // 0-9, a-z, A-Z
    // that function should create a base 62 number
} while (!contains(naughty_words, reducestring(short_id))

(Vous pouvez vous référer à d'autres recommandations d'url courtes comme celle-ci pour plus d'informations sur le hachage / conversion en base 62)

Maintenant , vous ne recevez plus les ID aiment a55, sh1tou « b00bs ». Votre liste de substitution de lettres n'aurait besoin que de contenir des caractères dans vos mots coquins, évidemment.

Puisque personne ne va lire « 455 » comme « cul » , alors vous pourriez aussi vouloir return stren reducestringsi elle ne contient pas de lettres.

Exemples

Le site de conception graphique Dribbble a ses propres identifiants de chaîne courts pour les publications. Ceux-ci utilisent 0-9, az et AZ comme http://drbl.in/dCWi .

J'ai fait quelques expériences et il y a des identifiants courts pour au moins quelques mots coquins. Je suppose que nous verrons quand ils arriveront f, mais ils ne sont pas encore là.

Accordé - donner à un utilisateur son propre url ( /user/whatever) d' identification personnelle au lieu d'un simple post est bien pire avec des mots coquins.

Nicole
la source
2
J'ai écrit une fois un programme qui générait des mots de passe pour un service en ligne. Ils étaient aléatoires, mais il y avait quelques heuristiques qui les rendaient prononçables, de sorte qu'ils seraient plus faciles à retenir. Et ces heuristiques ont conduit au blasphème. La solution était la suivante: recherchez les sous-chaînes vulgaires, y compris celles qui pourraient être prononcées de manière similaire aux mots vulgaires (par exemple, recherchez FUC et FUK) et régénérez le mot de passe. (Pour les rires, le programme a écrit les mots de passe rejetés dans un fichier séparé.)
kindall
1
Et comment allez-vous écrire une telle chose pour chaque langue ?
DeadMG
1
@DeadMG Pour l'ensemble complet de tous les mots offensants possibles, cela ne peut que rendre cet ensemble plus petit. Votre position est-elle vraiment: "parce que vous ne pouvez pas atteindre 100%, cela ne vaut automatiquement rien"?
Nicole
Qu'en est-il de l'UTF-8? Il existe de nombreux autres caractères imprimables qui permettent de contourner cette substitution.
JBRWilkinson
1
@JBRWilkinson qui ne s'applique pas parce que l'OP définit le jeu de caractères alphanumériques pour les identifiants, non?
Nicole
5

Envisagez plutôt d'utiliser une clé numérique ou hexadécimale. Cela vous évitera beaucoup de problèmes par rapport à l'écriture d'un filtre de blasphème compatible i18n, et le pire dont vous aurez à vous soucier est le boeuf mort .

Communauté
la source
1
+1: Je pense que c'est la solution la plus simple et la plus sûre. Vous pouvez générer un uuid sous la forme d'un nombre et utiliser une représentation sous forme de chaîne (décimal, hexadécimal, octal).
Giorgio
4
Vous devez toujours vous soucier de B16B00B5: P
CodesInChaos
3

Vous ne pouvez jamais empêcher un système automatisé de générer une chaîne offensante pour un utilisateur. Par exemple, en Chine, certains chiffres sont considérés comme malchanceux.

Tout ce que vous pouvez vraiment faire est de dire à l'utilisateur que son ID est aléatoire et que le contenu n'est pas pertinent et s'il l'obtient, /user/fuckeril doit simplement l'ignorer. Ces choses se produisent et il n'est tout simplement pas techniquement possible de l'éviter, tout comme vous ne pouvez jamais filtrer le blasphème.

DeadMG
la source
9
Je ne suis pas le downvoter, mais je suis très convaincu que pour les mots offensants, vous devez vraiment faire beaucoup, beaucoup, beaucoup mieux que "leur dire qu'ils devraient simplement l'ignorer". Le moins que vous puissiez faire est de proposer un moyen de changer l'identifiant généré en un identifiant qu'ils trouvent acceptable.
Marjan Venema
4
Je ne suis pas non plus le downvoter, mais je suis d'accord avec @MarjanVenema, / user / f * cker n'est pas acceptable
HappyDeveloper
@HappyDeveloper: Comme je l'ai déjà suggéré, qu'allez-vous faire à ce sujet? Vous ne pouvez pas empêcher les utilisateurs de recevoir des identifiants qu'ils trouvent offensants.
DeadMG
3
@DeadMG Vous pouvez aider la situation en évitant quelques cas souvent offensants . Je pensais que la question d'origine le disait assez clairement.
Nicole
2
@NickC: Les seuls exemples sont souvent offensants en anglais . Avez-vous une idée de ce qui est généralement offensant en arabe, portugais, chinois, russe? Sans parler du fait que ces langues peuvent avoir des jurons qui prennent de très nombreuses formes. Il est facile de cas particulier les formes évidentes des mots de l'anglais, mais pas si facile à faire pour tout le monde.
DeadMG
2

Il existe essentiellement deux stratégies que vous pouvez utiliser:

  1. Créez un système qui ne générera aucune chaîne offensante. Par exemple, vous ne pouvez composer votre identifiant qu'à partir de lettres consonantiques. En omettant toutes les voyelles, vous pouvez être sûr que votre système ne générera jamais de mots anglais, vilains ou autres.

  2. Après avoir généré un identifiant complètement aléatoire, assurez-vous que le nouvel identifiant n'inclut aucune sous-chaîne offensive.

Caleb
la source
1

Dans de nombreuses situations (spam par e-mail, blocage d'IP, etc.), une liste noire est un jeu perdant - vous ne pourrez jamais créer une liste noire "complète" de toutes les mauvaises choses possibles qui pourraient survenir. a b c d e f

Beaucoup de gens utilisent une liste blanche de mots acceptables et les enchaînent dans un ordre aléatoire. (Peut-être avec un tiret ou un point ou un espace entre chaque mot).

Certains dictionnaires populaires utilisés pour convertir des nombres arbitraires en une série de mots prononçables incluent:

David Cary
la source
0

Vous pouvez soit créer des nombres générés aléatoirement, soit avoir une expression régulière pour annuler ceux qui sont offensants:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid
Billjk
la source
2
Drôle, parce que je n'aurais jamais pensé à l'un d'eux comme offensant.
DeadMG
Je sais… C'est juste un sujet délicat de publier de vrais mots de malédiction sur un site SE: meta.stackexchange.com/questions/22232/…
Billjk