Як створити UUID, захищені від мови?


20

Я завжди хотів використовувати рядки, що генеруються випадковим чином, для ідентифікаторів моїх ресурсів, тому я міг би мати короткі URL-адреси, такі як: / user / 4jz0k1

Але я ніколи цього не робив, тому що мене хвилювало те, що генерація випадкових рядків створює фактичні слова, наприклад: / user / f * cker. Це спричиняє дві проблеми: це може бути заплутаним або навіть образливим для користувачів, і це може зіпсуватись із SEO.

Тоді я подумав, що все, що мені потрібно було, - це встановити фіксований зразок, як-от додавати число кожні 2 літери. Я був дуже задоволений своїм методом "create_safe_uuid", але тоді зрозумів, що це краще лише для SEO та гірше для користувачів, оскільки це збільшило співвідношення фактичних сформованих слів, наприклад: / user / g4yd1ck5

Тепер я думаю, що я міг би створити метод 'substitu_numbers_with_letters' і перевірити, чи він не утворює жодного слова проти словника чи чогось іншого.

Будь-які інші ідеї?

пс. Коли я це пишу, я також зрозумів, що перевірка на слова більш ніж однією мовою (наприклад, англійською та французькою, іспанською мовами тощо) буде безладом, і я знову починаю любити ідентифікатори, що мають лише цифри.

ОНОВЛЕННЯ

Деякі посилання, які кожен повинен прочитати:

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

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


Використовуєте хеш або контрольну суму? Якщо ви вважаєте за краще використовувати випадковий рядок, немає жодного правила, що вам доведеться використовувати кожну букву в алфавіті.
Остін Генлі

21
Не називайте це uuid, uuid - це універсальні унікальні ідентифікатори. Це стосується конкретної системи ідентифікаторів, яку ви можете використовувати. Це ви не робите тут, тому не використовуйте цей термін.
Вінстон Еверт

4
Я просто залишу вас з казкою про автоматичний генератор прокляття
Скотт Чемберлен

1
@HappyDeveloper, по-перше, це не універсально. Це специфічно для вашої заявки. По-друге, uuid спеціально посилається на en.wikipedia.org/wiki/Universally_unique_identifier не на будь-яку подібну схему, яку ви розробляли.
Вінстон Еверт

2
Це така неймовірна марнотратство. Шанси на те, що це насправді трапляється, занадто малі, щоб варто було б навіть подумати про ...
Майкл Боргвардт

Відповіді:


6

Кілька порад, які знизять шанси ненароком створити змістовні слова:

  • Додайте до суміші кілька нефайлових, нечислових символів, наприклад "-", "!" або "_".
  • Створіть свої UUID, накопичивши послідовності символів (а не одиничних символів), які навряд чи будуть зустрічатися в реальних словах, таких як "zx" або "aa".

Це зразок коду C # (використовуючи .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();  
}  

Це не гарантує, що ви нікого не образите, але я погоджуюся з @DeadMG, що ви не можете націлитись так високо.


1
Проблема не алфавітно-цифрових полягає в тому, що деякі з них не будуть грати приємно в URI (це призводить до втеченого символу, який є великим ні-ні в крихітній URL-адресі: є причина з bit.ly і tinyurl не використовують їх). Інша проблема полягає в тому, що вони менш інтуїтивні для користувача: їх не так просто, скажімо, записати на пост - або передати по телефону (багато нетехнологів не мають поняття, як називається підкреслення, для приклад). Ще раз є причина, чому крихітні URL та bit.ly не використовують їх.
user988052

@ user988052: звідси деякі нефайлові , нечислові символи. Вибрати декілька, які добре підходять для URI та досить легкі для людини.
CesarGon

"Звідси деякі нефайлові, нечислові символи." [sic] ... Служби скорочення URL-адрес (bit.ly, tinyurl, t.co, goo.gl тощо), здається, вважають, що нульовий не-алфавіт кращий, ніж "деякі". І я думаю, що причини, які я пояснював у своїх попередніх коментарях, є частиною пояснення того, чому ці служби не згодні з вашою точкою зору. Очевидно, наші думки з цього питання різняться, і я залишу вам останнє слово; )
користувач988052

@ user988052: я використовував goo.gl протягом століть, і у нього ніколи не виникало проблем з перетворенням всіляких символів, які не містять альфа; єдиний виняток -%. Ви можете знайти це задокументовано в дискусійній групі служби. Чи можете ви надати будь-яку довідку, яка б резервувала ваші претензії?
CesarGon

1
ОП заявила, що хоче коротких імен, і просить метод їх генерування. Ви пропонуєте "додати до суміші синфайливі ненімічні символи" [sic]. То що ти пропонуєш? Що ОП спочатку генерує "щось", а потім надсилає це на tinyurl / bit.ly? Я думаю, що це не те, що ОП після. ОП хоче безпосередньо генерувати порівняно "крихітну" URL-адресу. Все, що я говорю, - якщо це те, що він шукає, то йому може бути краще використовувати алфавітний алфавіт, як це робить tinyurl / bit.ly! Зараз я справді відключився.
користувач988052

5

Просто створіть список неслухняних слів, список підстановки букв, а потім, якщо будь-який створений ідентифікатор є неслухняним словом, повторіть його.

Наприклад (псевдо-код)

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

(Ви можете посилатися на інші короткі рекомендації URL-адреси, як ця, щоб отримати інформацію про хешування / перетворення на базі 62)

Тепер ви більше не отримуєте ідентифікатори подобається a55, sh1tабо «b00bs». У вашому списку заміни листів, очевидно, потрібно містити символи лише у ваших неслухняних словах.

Так як ніхто не буде читати «455» , як «жопу» , то ви також можете return strв , reducestringякщо вона не містить ніяких листів.

Приклади

Сайт графічного дизайну Dribbble має власні ідентифікатори коротких рядків для публікацій. Вони використовують 0-9, az та AZ, як http://drbl.in/dCWi .

Я зробив кілька експериментів, і є короткі ідентифікатори принаймні на кілька неслухняних слів. Я думаю, ми побачимо, коли вони дістаються f, але їх поки немає.

Зрозуміло - надання користувачеві свого власного ідентифікаційного URL ( /user/whatever) замість просто публікації набагато гірше з неслухняними словами.


2
Я колись написав програму, яка генерувала паролі для онлайн-сервісу. Вони були випадковими, але було декілька евристик, які робили їх виразними, щоб їх було легше запам'ятати. І ці евристики призвели до ненормативної лексики. Рішення було таким, як описано тут: перевірте наявність вульгарних підрядів, включаючи ті, які можна вимовити аналогічно вульгарним словам (наприклад, шукайте FUC та FUK) та відновіть пароль. (Для хихикань програма написала відхилені паролі в окремий файл.)
kindall

1
І як, на землі, ти збираєшся писати таку річ для кожної мови ?
DeadMG

1
@DeadMG Для повного набору всіх можливих образливих слів це може лише зменшити цей набір. Чи справді ваша позиція: «оскільки ви не можете досягти 100%, автоматично нічого не варто робити»?
Ніколь

А як щодо UTF-8? Існує багато альтернативних символів для друку, які обходять цю заміну.
JBRWilkinson

1
@JBRWilkinson не застосовується, оскільки ОП встановлює набір символів буквено-цифрових символів для ідентифікаторів, правда?
Ніколь

5

Спробуйте скористатися числовим або шістнадцятковим ключем. Це допоможе вам заощадити багато клопотів порівняно з написанням фільтра про ненормативну лексику, який сприймає i18n, і найгірше, про що вам доведеться турбуватися, - це мертва яловичина .


1
+1: Я думаю, що це найпростіше і безпечне рішення. Ви можете створити uuid у вигляді числа і використовувати для нього рядкове подання (десятковий, шістнадцятковий, восьмеричний).
Джорджіо

4
Вам ще доведеться турбуватися про B16B00B5: P
CodesInChaos

3

Ніколи не можна перешкоджати автоматизованій системі генерувати деяку рядок, образливий для користувача. Наприклад, у Китаї деякі цифри вважаються нещасливими.

Все, що ви дійсно можете зробити, це сказати користувачеві, що їх ідентифікатор випадковий, а вміст не має значення, і якщо вони отримають, /user/fuckerвони повинні просто ігнорувати його. Такі речі трапляються, і цього просто технічно неможливо уникнути - як ніколи не можна фільтрувати нецензурну лексику.


9
Я не прихильник, але дуже сильно відчуваю, що для образливих слів вам потрібно зробити багато, багато, набагато краще, ніж "сказати їм, що вони повинні просто ігнорувати це". Найменше, що можна зробити, - це запропонувати певний спосіб змінити згенерований ідентифікатор на той, який вони вважають прийнятним.
Мар'ян Венема

4
Я теж не похитник, але я згоден з @MarjanVenema, / користувач / f * cker не прийнятний
HappyDeveloper

@HappyDeveloper: Як я вже пропонував, що ви збираєтеся робити з цим? Ви не можете перешкодити користувачам отримувати посвідчення особи, які вважають образливими.
DeadMG

3
@DeadMG Ви можете допомогти ситуації, запобігаючи декілька випадків, що часто наступають . Я подумав, що оригінальне запитання зробило це досить зрозумілим.
Ніколь

2
@NickC: Єдині приклади, як правило, образливі англійською мовою . Чи маєте ви уявлення про те, що зазвичай є образливим в арабській, португальській, китайській, російській мовах? Не кажучи вже про те, що в цих мовах можуть бути присяжні слова, які мають багато-багато форм. Очевидними формами слів з англійської мови на спеціальні регістри легко, але це не так просто зробити для всіх.
DeadMG

2

По суті, ви можете використовувати дві стратегії:

  1. Створіть систему, яка не генеруватиме образливих рядків. Наприклад, ви можете складати свій ідентифікатор лише з букв приголосних. Залишаючи всі голосні, ви можете бути впевнені, що ваша система ніколи не породжує англійських слів, неслухняних чи інших.

  2. Створивши абсолютно випадковий ідентифікатор, переконайтеся, що новий ідентифікатор не містить жодних образливих підрядів.


1

У багатьох ситуаціях (спам електронної пошти, блокування ip тощо) чорний список є програшною грою - ви ніколи не зможете скласти "повний" чорний список усіх можливих поганих речей, які коли-небудь могли трапитися. a b c d e f

Багато людей використовують білий список прийнятних слів і з'єднують їх у довільному порядку. (Можливо, з тире або крапкою або пробілом між кожним словом).

Деякі популярні словники, які використовуються для перетворення довільних чисел у вимовний ряд слів, включають:


0

Ви можете або зробити це просто випадковим чином згенерованими номерами, або створити регулярний вираз, щоб скасувати ті, що є образливими:

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

2
Смішно, тому що я ніколи з них не вважаю образливим.
DeadMG

Я знаю… Це просто чутливий предмет, коли розміщувати справжні слова прокляття на веб-сайті SE: meta.stackexchange.com/questions/22232/…
Billjk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.