Come generare UUID "sicuri per la lingua"?


20

Ho sempre voluto usare stringhe generate casualmente per gli ID delle mie risorse, quindi avrei potuto avere URL più brevi come questo: / user / 4jz0k1

Ma non l'ho mai fatto, perché ero preoccupato per la generazione casuale di stringhe che creava parole reali, ad esempio: / user / f * cker. Ciò comporta due problemi: potrebbe essere fonte di confusione o addirittura offensivo per gli utenti e potrebbe anche rovinare il SEO.

Poi ho pensato che tutto quello che dovevo fare era impostare uno schema fisso come aggiungere un numero ogni 2 lettere. Sono stato molto contento del mio metodo "generate_safe_uuid", ma poi ho capito che era solo meglio per SEO, e peggio per gli utenti, perché aumentava il rapporto tra le parole reali generate, ad esempio: / user / g4yd1ck5

Ora sto pensando di poter creare un metodo "replace_numbers_with_letters" e verificare che non abbia formato parole contro un dizionario o qualcosa del genere.

Altre idee?

ps. Mentre scrivo, mi sono anche reso conto che cercare parole in più di una lingua (es. Inglese e francese, spagnolo, ecc.) Sarebbe stato un disastro, e sto ricominciando ad amare gli ID solo numeri.

AGGIORNARE

Alcuni link che tutti dovrebbero leggere:

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

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


Utilizzare un hash o un checksum? Se si preferisce utilizzare una stringa casuale, non vi è alcuna regola che è necessario utilizzare ogni lettera dell'alfabeto.
Austin Henley,

21
Non chiamarlo uuid, sono identificatori universalmente univoci. Si riferisce a un sistema specifico di identificatori che è possibile utilizzare. Non è quello che stai facendo qui, quindi non usare quel termine.
Winston Ewert,

4
Ti lascio solo con il racconto del generatore di maledizione automatico
Scott Chamberlain,

1
@HappyDeveloper, in primo luogo, non è universale. È specifico per la tua applicazione. In secondo luogo, uuid si riferisce specificamente a en.wikipedia.org/wiki/Universally_unique_identifier e non a qualsiasi schema simile che tu abbia ideato.
Winston Ewert,

2
Questo è un incredibile spreco di tempo. Le possibilità che ciò accada effettivamente sono troppo piccole per valere la pena anche solo di pensare ...
Michael Borgwardt,

Risposte:


6

Un paio di suggerimenti che ridurranno le possibilità di creare inavvertitamente parole significative:

  • Aggiungi alcuni caratteri non alfa e non numerici al mix, come "-", "!" o "_".
  • Componi i tuoi UUID accumulando sequenze di caratteri (anziché singoli caratteri) che è improbabile che si verifichino in parole reali, come "zx" o "aa".

Questo è un po 'di codice di esempio C # (usando .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();  
}  

Questo non garantisce che non offenderai nessuno, ma sono d'accordo con @DeadMG che non puoi mirare così in alto.


1
il problema con i caratteri non alfanumerici è che alcuni di essi non devono essere adatti agli URI (portando a caratteri di escape, che sono un grande no-no in un piccolo URL: c'è una ragione per cui bit.ly e tinyurl non li usano). L'altro problema è che sono meno intuitivi per l'utente: non sono facili, per esempio, scrivere su un post-it o trasmettere al telefono (molti non tecnici non hanno idea di quale sia il nome del trattino basso, perché esempio). Ancora una volta c'è un motivo per cui piccoli URL e bit.ly non li stanno usando.
user988052

@ user988052: Da qui alcuni caratteri non alfa, non numerici. È facile selezionare alcuni che vanno bene per gli URI e abbastanza facili per gli umani.
CesarGon,

"Da qui alcuni caratteri non alfa, non numerici." [sic] ... i servizi di accorciamento degli URL (bit.ly, tinyurl, t.co, goo.gl, ecc.) sembrano pensare che zero non alfano sia migliore di "alcuni". E penso che i motivi che ho spiegato nei miei precedenti commenti facciano parte della spiegazione del perché questi servizi non sono d'accordo con il tuo punto di vista. Ora ovviamente le nostre opinioni sono diverse sulla questione e ti lascerò l'ultima parola; )
user988052,

@ user988052: Uso goo.gl da anni e non ho mai avuto problemi con la conversione di tutti i tipi di caratteri non alfa; l'unica eccezione è%. Puoi trovarlo documentato nel gruppo di discussione del servizio. Potete fornire qualche riferimento a sostegno delle vostre richieste?
CesarGon

1
OP ha dichiarato di volere nomi brevi e chiede un metodo per generarli. Suggerisci "aggiungere al figlio caratteri non alfa e non numerici" [sic]. Allora cosa stai suggerendo? Che OP genera prima "qualcosa" e poi lo invia a tinyurl / bit.ly? Penso che non sia quello che sta cercando OP. OP vuole generare direttamente un URL relativamente "minuscolo". Tutto quello che sto dicendo è che se è quello che sta cercando, potrebbe essere meglio per lui usare un alfabeto alfanumerico, proprio come sta facendo tinyurl / bit.ly! Adesso sono davvero fuori.
user988052,

5

Basta creare un elenco di parole birichine, un elenco di sostituzione delle lettere e quindi se un ID generato è una parola birichina, ripetere.

Ad esempio (pseudo codice)

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))

(Puoi fare riferimento ad altri brevi consigli come questo url per informazioni su hashing / conversione di base 62)

Ora non è più ottenere gli ID piace a55, sh1to "b00bs". L'elenco di sostituzione delle lettere dovrebbe contenere solo caratteri nelle tue parole cattive, ovviamente.

Dal momento che nessuno sta andando a leggere "455" come "culo", allora si potrebbe anche voler return strin reducestringse non contiene alcuna lettera.

Esempi

Il sito di progettazione grafica Dribbble ha i propri ID stringa brevi per i post. Questi usano 0-9, az e AZ come http://drbl.in/dCWi .

Ho fatto alcuni esperimenti e ci sono brevi ID per almeno qualche parolaccia. Immagino che vedremo quando arriveranno f, ma non ci sono ancora.

Concesso: dare a un utente il proprio URL di identificazione personale ( /user/whatever) anziché solo un post è molto peggio con le parole cattive.


2
Una volta ho scritto un programma che ha generato password per un servizio online. Erano casuali, ma c'erano alcune euristiche che li rendevano abbastanza pronunciabili, quindi sarebbero stati ricordati più facilmente. E queste euristiche hanno portato a volgarità. La soluzione era la seguente: controlla la presenza di sottostringhe volgari, comprese quelle che potrebbero essere pronunciate in modo simile alle parole volgari (ad esempio, cerca FUC e FUK) e rigenera la password. (Per risatine, il programma ha scritto le password rifiutate in un file separato.)
kindall

1
E come mai hai intenzione di scrivere una cosa del genere per ogni lingua ?
DeadMG

1
@DeadMG Per l'insieme completo di tutte le possibili parole offensive, questo può solo ridurlo. La tua posizione è davvero: "perché non puoi raggiungere il 100%, automaticamente non vale la pena fare nulla"?
Nicole,

Che dire di UTF-8? Ci sono molti caratteri stampabili alternativi che aggirano questa sostituzione.
JBR Wilkinson,

1
@JBRWilkinson che non si applica perché l'OP sta impostando il set di caratteri di caratteri alfanumerici per gli ID, giusto?
Nicole,

5

Prendi invece in considerazione l'uso di una chiave numerica o esadecimale. Ti risparmierà un sacco di problemi rispetto alla scrittura di un filtro volgarità i18n, e il peggio di cui dovrai preoccuparti è il manzo morto .


1
+1: Penso che questa sia la soluzione più semplice e sicura. È possibile generare un uuid sotto forma di un numero e utilizzare una rappresentazione di stringa per esso (decimale, esadecimale, ottale).
Giorgio,

4
Devi ancora preoccuparti di B16B00B5: P
CodesInChaos il

3

Non puoi mai impedire a un sistema automatizzato di generare una stringa offensiva per un utente. Ad esempio, in Cina alcuni numeri sono considerati sfortunati.

Tutto quello che puoi davvero fare è dire all'utente che il loro ID è casuale e che i contenuti sono irrilevanti e se lo ottengono /user/fuckerdovrebbero semplicemente ignorarlo. Queste cose accadono e non è tecnicamente fattibile evitarlo, proprio come non puoi mai filtrare volgarità.


9
Non sono il downvoter, ma sento fortemente che per le parole offensive devi davvero fare molto, molto, molto meglio di "dire loro che dovrebbero semplicemente ignorarlo". Il minimo che puoi fare è offrire un modo per cambiare l'id generato in uno che ritengono accettabile.
Marjan Venema,

4
Nemmeno io sono il downvoter, ma sono d'accordo con @MarjanVenema, / user / f * cker non è accettabile
HappyDeveloper

@HappyDeveloper: Come ho già suggerito, che cosa hai intenzione di fare al riguardo? Non puoi impedire agli utenti di ricevere ID che ritengono offensivi.
DeadMG

3
@DeadMG Puoi aiutare la situazione prevenendo alcuni casi comunemente offensivi . Pensavo che la domanda originale lo avesse reso abbastanza chiaro.
Nicole,

2
@NickC: gli unici esempi sono comunemente offensivi in inglese . Hai idea di cosa sia comunemente offensivo in arabo, portoghese, cinese, russo? Per non parlare del fatto che quelle lingue possono avere parolacce che assumono molte, molte forme. È facile nel caso speciale le forme ovvie delle parole dall'inglese, ma non è così facile farlo per tutti.
DeadMG

2

Esistono essenzialmente due strategie che è possibile utilizzare:

  1. Crea un sistema che non generi stringhe offensive. Ad esempio, puoi comporre il tuo ID solo da lettere consonanti. Tralasciando tutte le vocali, puoi essere sicuro che il tuo sistema non genererà mai parole inglesi, cattive o meno.

  2. Dopo aver generato un ID completamente casuale, verificare che il nuovo ID non includa sottostringhe offensive.


1

In molte situazioni (e-mail spam, blocco IP, ecc.), Una lista nera è un gioco perdente - non sarai mai in grado di creare una lista nera "completa" di ogni possibile brutta cosa che possa mai accadere. a b c d e f

Molte persone usano una lista bianca di parole accettabili e le mettono insieme in un ordine casuale. (Forse con un trattino o un punto o uno spazio tra ogni parola).

Alcuni dizionari popolari utilizzati per convertire numeri arbitrari in una serie pronunciabile di parole includono:


0

Puoi renderlo solo numeri generati casualmente o avere una regex per cancellare quelli che sono offensivi:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid

2
Divertente, perché non avrei mai pensato a nessuno dei due come offensivo.
DeadMG

Lo so ... È solo un argomento delicato per pubblicare vere e proprie parolacce su un sito SE: meta.stackexchange.com/questions/22232/…
Billjk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.