Wie erstelle ich "sprachsichere" UUIDs?

20

Ich wollte immer zufällig generierte Zeichenfolgen für die IDs meiner Ressourcen verwenden, damit ich kürzere URLs wie diese haben kann: / user / 4jz0k1

Das habe ich aber nie getan, weil ich mir Sorgen gemacht habe, dass durch die Zufallsgenerierung von Zeichenfolgen tatsächliche Wörter erzeugt werden, z. B .: / user / f * cker. Dies bringt zwei Probleme mit sich: Es kann verwirrend oder sogar anstößig für die Benutzer sein und es kann sich auch auf die SEO auswirken.

Dann dachte ich, alles was ich tun musste, war ein festes Muster zu erstellen, wie das Hinzufügen einer Zahl alle 2 Buchstaben. Ich war sehr zufrieden mit meiner Methode 'generate_safe_uuid', aber dann wurde mir klar, dass sie nur für SEO besser und für Benutzer schlechter ist, da sie den Anteil der tatsächlich generierten Wörter erhöht, z. B .: / user / g4yd1ck5

Jetzt denke ich, ich könnte eine Methode 'replace_numbers_with_letters' erstellen und überprüfen, ob sie keine Wörter gegen ein Wörterbuch oder etwas gebildet hat.

Irgendwelche anderen Ideen?

ps. Während ich dies schreibe, wurde mir auch klar, dass das Suchen nach Wörtern in mehr als einer Sprache (z. B. Englisch und Französisch, Spanisch usw.) ein Chaos sein würde, und ich beginne wieder, IDs zu lieben, die nur aus Zahlen bestehen.

AKTUALISIEREN

Einige Links, die jeder lesen sollte:

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

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

HappyDeveloper
quelle
Verwenden Sie einen Hash oder eine Prüfsumme? Wenn Sie es vorziehen, eine zufällige Zeichenfolge zu verwenden, ist es keine Regel, dass Sie jeden Buchstaben im Alphabet verwenden müssen.
Austin Henley
21
Nennen Sie es nicht uuid, uuid sind universell eindeutige Bezeichner. Es bezieht sich auf ein bestimmtes Identifizierungssystem, das Sie verwenden können. Das ist nicht das, was du hier tust, also benutze diesen Begriff nicht.
Winston Ewert
4
Ich werde Sie nur mit der Geschichte des automatischen Fluchgenerators
Scott Chamberlain
1
@ HappyDeveloper, erstens, es ist nicht universell. Es ist spezifisch für Ihre Anwendung. Zweitens bezieht sich uuid speziell auf en.wikipedia.org/wiki/Universally_unique_identifier und nicht auf ein ähnliches Schema, das Sie sich ausgedacht haben.
Winston Ewert
2
Dies ist eine unglaubliche Verschwendung von Kopfschmerzen. Die Wahrscheinlichkeit, dass es tatsächlich passiert, ist viel zu gering, als dass man darüber nachdenken könnte ...
Michael Borgwardt

Antworten:

6

Ein paar Tipps, die die Wahrscheinlichkeit verringern, versehentlich bedeutungsvolle Wörter zu erstellen:

  • Fügen Sie der Mischung einige nicht alphanumerische Zeichen hinzu, z. B. "-", "!" oder "_".
  • Stellen Sie Ihre UUIDs zusammen, indem Sie Zeichenfolgen (statt einzelner Zeichen) ansammeln, die in realen Wörtern wie "zx" oder "aa" wahrscheinlich nicht vorkommen.

Dies ist ein C # -Beispielcode (unter Verwendung von .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();  
}  

Dies garantiert nicht, dass Sie niemanden beleidigen, aber ich stimme mit @DeadMG überein, dass Sie nicht so hoch zielen können.

CesarGon
quelle
1
Das Problem mit nicht-alphanumerischen Zeichen ist, dass einige von ihnen in URIs nicht gut wiedergegeben werden (was zu Escape-Zeichen führt, die ein großes Nein-Nein in einer winzigen URL sind: Es gibt einen Grund, warum bit.ly und tinyurl sie nicht verwenden). Das andere Problem ist, dass sie für den Benutzer weniger intuitiv sind: Sie sind nicht einfach, z. B. auf ein Post-It aufzuschreiben oder auf dem Telefon zu übertragen (viele Nicht-Techniker haben keine Ahnung, wie der Name des Unterstrichs lautet, z Beispiel). Es gibt wieder einen Grund, warum tiny url und bit.ly sie nicht verwenden.
user988052
@ user988052: Daher einige nicht alphanumerische Zeichen. Es ist einfach, ein paar auszuwählen, die für URIs in Ordnung und für Menschen in Ordnung sind.
CesarGon
"Daher einige nicht-alphanumerische Zeichen." [sic] ... URL-Verkürzungsdienste (bit.ly, tinyurl, t.co, goo.gl, etc.) scheinen zu denken, dass null nicht-alphanum besser ist als "einige". Und ich denke, dass die Gründe, die ich in meinen vorherigen Kommentaren dargelegt habe, Teil der Erklärung sind, warum diese Dienste nicht mit Ihrer Sichtweise übereinstimmen. Offensichtlich sind unsere Meinungen in dieser Angelegenheit unterschiedlich und ich lasse Ihnen das letzte Wort. )
user988052
@ user988052: Ich benutze goo.gl seit Ewigkeiten und es gab nie ein Problem beim Konvertieren aller Arten von Nicht-Alpha-Zeichen. Die einzige Ausnahme ist%. Sie finden dies dokumentiert in der Diskussionsgruppe des Dienstes. Können Sie eine Referenz angeben, die Ihre Ansprüche stützt?
CesarGon
1
OP gab an, er wolle kurze Namen und frage nach einer Methode, um diese zu erzeugen. Sie schlagen vor, "dem Mix nicht-alphanumerische Zeichen des Sohnes hinzuzufügen" [sic]. Also, was schlagen Sie vor? Das OP erzeugt zuerst "etwas" und sendet dies dann an tinyurl / bit.ly? Ich denke, das ist nicht das, wonach OP strebt. OP möchte direkt eine URL erzeugen, die relativ "winzig" ist. Ich sage nur, wenn er danach strebt, ist es für ihn vielleicht besser, ein Alphanum-Alphabet zu verwenden, so wie es tinyurl / bit.ly tut! Jetzt bin ich wirklich weg.
user988052
5

Erstellen Sie einfach eine ungezogene Wortliste, eine Buchstabenersetzungsliste, und wiederholen Sie sie, wenn eine generierte ID ein ungezogenes Wort ist.

Zum Beispiel (Pseudocode)

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

( Informationen zum Hashing / zur Konvertierung auf Basis 62 finden Sie in anderen kurzen URL-Empfehlungen wie dieser. )

Jetzt erhalten Sie keine IDs wie " a55, sh1t" oder "b00bs" mehr. Ihre Buchstabenersetzungsliste muss natürlich nur Zeichen in Ihren ungezogenen Wörtern enthalten.

Da niemand „455“ als „Esel“ lesen wird dann könnten Sie auch wollen return strin , reducestringwenn sie keine Buchstaben enthält.

Beispiele

Die Grafikdesign-Site Dribbble hat eigene kurze String-IDs für Posts. Diese verwenden 0-9, az und AZ wie http://drbl.in/dCWi .

Ich habe ein bisschen experimentiert und es gibt kurze IDs für mindestens ein paar freche Wörter. Ich denke, wir werden sehen, wann sie ankommen f, aber sie sind noch nicht da.

Zugegeben - es /user/whateverist viel schlimmer , einem Benutzer eine eigene, persönlich identifizierende URL ( ) zu geben, anstatt nur einen Beitrag zu verfassen.

Nicole
quelle
2
Ich habe einmal ein Programm geschrieben, das Passwörter für einen Onlinedienst generiert. Sie waren zufällig, aber es gab ein paar Heuristiken, die sie aussprechbarer machten, so dass man sich leichter an sie erinnern konnte. Und diese Heuristiken führten zu Obszönitäten. Die Lösung war wie hier beschrieben: Suchen Sie nach vulgären Teilzeichenfolgen, einschließlich solcher, die ähnlich wie vulgäre Wörter ausgesprochen werden könnten (z. B. nach FUC und FUK suchen), und generieren Sie das Kennwort neu. (Für Kichern schrieb das Programm die abgelehnten Passwörter in eine separate Datei.)
irgendwie
1
Und wie um alles in der Welt wirst du so etwas für jede Sprache schreiben ?
DeadMG
1
@DeadMG Für den vollständigen Satz aller möglichen beleidigenden Wörter kann dies nur diesen Satz verkleinern. Ist Ihre Haltung wirklich: "Weil Sie nicht 100% erreichen können, lohnt es sich automatisch, nichts zu tun"?
Nicole
Was ist mit UTF-8? Es gibt viele alternative druckbare Zeichen, die diese Ersetzung umgehen.
JBRWilkinson
1
@ JBRWilkinson, das nicht zutrifft, weil das OP den Zeichensatz alphanumerischer Zeichen für IDs festlegt, oder?
Nicole
5

Verwenden Sie stattdessen einen numerischen oder hexadezimalen Schlüssel. Es erspart Ihnen viel Ärger im Vergleich zum Schreiben eines i18n-bewussten Profanitätsfilters, und das Schlimmste, worüber Sie sich Sorgen machen müssen, ist totes Rindfleisch .

Gemeinschaft
quelle
1
+1: Ich denke, das ist die einfachste und sicherste Lösung. Sie können eine UUID in Form einer Zahl generieren und eine Zeichenfolgendarstellung dafür verwenden (dezimal, hexadezimal, oktal).
Giorgio
4
Sie haben noch Grund zur Sorge B16B00B5: P
CodesInChaos
3

Sie können niemals verhindern, dass ein automatisiertes System Zeichenfolgen generiert, die für einen Benutzer anstößig sind. In China beispielsweise gelten einige Zahlen als unglücklich.

Alles, was Sie wirklich tun können, ist dem Benutzer mitzuteilen, dass seine ID zufällig ist und der Inhalt irrelevant ist. Wenn er diese erhält /user/fucker, sollte er sie einfach ignorieren. Diese Dinge passieren und es ist technisch nicht machbar, sie zu vermeiden - so wie man Profanität niemals filtern kann.

DeadMG
quelle
9
Ich bin nicht der Downvoter, aber ich bin der festen Überzeugung, dass Sie für beleidigende Worte wirklich viel, viel, viel besser tun müssen, als "ihnen zu sagen, dass sie es einfach ignorieren sollten". Das Mindeste, was Sie tun können, ist eine Möglichkeit anzubieten, die generierte ID in eine für sie akzeptable ID zu ändern.
Marjan Venema
4
Ich bin auch nicht der Abwähler, aber ich stimme @ MarjanVenema zu, / user / f * cker ist nicht akzeptabel
HappyDeveloper
@ HappyDeveloper: Wie ich bereits angedeutet habe, was wirst du dagegen tun? Sie können nicht verhindern, dass Benutzern anstößige IDs zugewiesen werden.
DeadMG
3
@DeadMG Sie können helfen , die Situation ein paar durch die Verhinderung häufig Offensive Fälle. Ich dachte, die ursprüngliche Frage hat das ziemlich deutlich gemacht.
Nicole
2
@ NickC: Die einzigen Beispiele sind in Englisch allgemein anstößig . Haben Sie eine Idee, was in Arabisch, Portugiesisch, Chinesisch, Russisch allgemein anstößig ist? Ganz zu schweigen von der Tatsache, dass diese Sprachen Schimpfwörter haben können, die viele, viele Formen annehmen. Es ist leicht, die offensichtlichen Formen der Wörter aus dem Englischen in Sonderfälle zu fassen, aber nicht so einfach, dies für alle zu tun.
DeadMG
2

Grundsätzlich gibt es zwei Strategien, die Sie anwenden können:

  1. Erstellen Sie ein System, das keine anstößigen Zeichenfolgen generiert. Beispielsweise können Sie Ihre IDs nur aus Konsonantenbuchstaben zusammensetzen. Wenn Sie alle Vokale weglassen, können Sie sicher sein, dass Ihr System niemals ungezogene oder sonstige englische Wörter generiert.

  2. Stellen Sie nach dem Generieren einer vollständig zufälligen ID sicher, dass die neue ID keine anstößigen Teilzeichenfolgen enthält.

Caleb
quelle
1

In vielen Situationen (E-Mail-Spam, IP-Blockierung usw.) ist eine Blacklist ein Verlustspiel - Sie werden niemals in der Lage sein, eine "vollständige" Blacklist aller möglichen negativen Ereignisse zu erstellen, die jemals auftreten könnten. a b c d e f

Viele Leute benutzen eine Whitelist akzeptabler Wörter und reihen sie in zufälliger Reihenfolge aneinander. (Vielleicht mit einem Bindestrich oder Punkt oder Leerzeichen zwischen jedem Wort).

Einige beliebte Wörterbücher, die zum Konvertieren beliebiger Zahlen in eine aussprechbare Folge von Wörtern verwendet werden, umfassen:

David Cary
quelle
0

Sie können entweder nur zufällig generierte Zahlen erstellen oder eine Regex verwenden, um die beleidigenden Zahlen zu löschen:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid
Billjk
quelle
2
Witzig, denn ich würde nie denken, dass einer von beiden beleidigend ist.
DeadMG
Ich weiß ... Es ist nur ein heikles Thema, echte Schimpfwörter auf einer SE-Site zu veröffentlichen: meta.stackexchange.com/questions/22232/…
Billjk