"언어 안전"UUID를 생성하는 방법


20

항상 리소스 ID에 임의로 생성 된 문자열을 사용하고 싶기 때문에 다음과 같이 더 짧은 URL을 가질 수 있습니다. / user / 4jz0k1

그러나 실제 단어를 생성하는 임의의 문자열 생성에 대해 걱정했기 때문에 한 번도하지 않았습니다. 예 : / user / f * cker. 이로 인해 사용자에게는 혼란 스럽거나 불쾌감을 줄 수 있으며 SEO에도 문제가 생길 수 있습니다.

그런 다음 내가해야 할 일은 2 글자마다 숫자를 추가하는 것과 같은 고정 패턴을 설정하는 것이라고 생각했습니다. 나는 'generate_safe_uuid'방법에 매우 만족했지만, 생성되는 실제 단어의 비율이 증가했기 때문에 SEO에만 더 좋고 사용자에게는 더 나쁘다는 것을 깨달았습니다. 예 : / user / g4yd1ck5

이제 'replace_numbers_with_letters'메서드를 만들고 사전이나 다른 단어에 대해 단어를 형성하지 않았는지 확인하고 있습니다.

다른 아이디어가 있습니까?

추신. 이 글을 쓰면서 여러 언어 (예 : 영어, 프랑스어, 스페인어 등)로 단어를 확인하는 것이 엉망이되고 숫자 전용 ID를 다시 사랑하기 시작했습니다.

최신 정보

모두가 읽어야 할 일부 링크 :

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

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


해시 또는 체크섬을 사용 하시겠습니까? 임의의 문자열을 사용하려면 알파벳의 모든 문자를 사용해야한다는 규칙이 없습니다.
Austin Henley

21
그것을 uuid라고 부르지 마십시오. uuid는 보편적으로 고유 한 식별자입니다. 이는 사용할 수있는 특정 식별자 시스템을 나타냅니다. 그것은 당신이 여기서하고있는 것이 아니므로 그 용어를 사용하지 마십시오.
Winston Ewert

4
난 그냥의 이야기에 당신을 떠나 자동 저주 생성기
스콧의 전관에게

1
@HappyDeveloper는 첫째 보편적이지 않습니다. 응용 프로그램에 따라 다릅니다. 두 번째로, uuid는 en.wikipedia.org/wiki/Universally_unique_identifier를 구체적으로 언급합니다 .
Winston Ewert

2
이것은 엄청난 시간 낭비입니다. 실제로 일어날 가능성은 생각조차하기에는 너무 작습니다 ...
Michael Borgwardt

답변:


6

뜻하지 않게 의미있는 단어를 만들 가능성을 낮추는 몇 가지 팁 :

  • "-", "!"와 같이 알파벳이 아닌 숫자가 아닌 문자를 믹스에 추가하십시오. 또는 "_".
  • "zx"또는 "aa"와 같이 실제 단어에서는 거의 발생하지 않는 일련의 문자 (단일 문자가 아닌)를 누적하여 UUID를 작성하십시오.

이것은 .NET 4를 사용하는 C # 샘플 코드입니다.

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 중 일부가 URI에서 잘 작동하지 않는다는 것입니다 (이스케이프 된 문자로 이어집니다.이 URL은 크지 않습니다. bit.ly 및 tinyurl을 사용하지 않는 이유가 있습니다). 다른 문제는 사용자에게 직관적이지 않다는 것입니다. 예를 들어 포스트잇에 적거나 전화로 전송하기가 쉽지 않습니다 (많은 비 기술자들은 밑줄의 이름이 무엇인지 모릅니다). 예). 다시 한 번 작은 URL과 bit.ly가 사용하지 않는 이유가 있습니다.
user988052

@ user988052는 : 따라서 일부 비 알파, 숫자가 아닌 문자. URI에는 적합하고 인간에게는 충분히 쉬운 몇 가지를 쉽게 선택할 수 있습니다.
CesarGon

"따라서 알파벳이 아닌 숫자가 아닌 문자도 있습니다." [sic] ... URL 단축 서비스 (bit.ly, tinyurl, t.co, goo.gl 등)는 0이 아닌 영숫자가 "일부"보다 낫다고 생각하는 것 같습니다 . 이전 의견에서 설명한 이유는 이러한 서비스가 귀하의 관점에 동의하지 않는 이유에 대한 설명의 일부라고 생각합니다. 분명히 우리의 의견은 그 문제에 대해 다르므로 나는 마지막 단어를 남길 것입니다. )
user988052

@ user988052 : goo.gl을 오랫동안 사용 해 왔으며 모든 종류의 알파벳이 아닌 문자를 변환하는 데 문제가 없었습니다. 유일한 예외는 %입니다. 서비스의 토론 그룹에서이 문서를 찾을 수 있습니다. 귀하의 주장을 뒷받침하는 참조를 제공 할 수 있습니까?
CesarGon

1
OP는 짧은 이름을 원했고이를 생성 할 방법을 요청했습니다. "아들에 알파벳이 아닌 숫자가 아닌 문자를 믹스에 추가" [sic]를 제안 합니다. 그래서 당신은 무엇을 제안합니까? 그 OP는 먼저 "무언가"를 생성 한 다음 tinyurl / bit.ly로 전송합니까? 나는 그것이 OP 이후가 아니라고 생각합니다. OP 는 상대적으로 "작은"URL 을 직접 생성 하려고합니다 . 내가 말하는 것은 그것이 그가 따르는 것이라면, tinyurl / bit.ly 가하는 것처럼 알파 숫자 알파벳을 사용하는 것이 더 나을 수 있다는 것입니다! 지금은 정말 꺼져 있습니다.
user988052

5

장난 꾸러기 단어 목록, 문자 대체 목록을 만든 다음 생성 된 ID가 장난 꾸러기 단어이면 다시 실행하십시오.

예를 들어 (의사 코드)

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) 해싱 / 변환에 대한 정보)

이제 더 이상 ID를 좋아 얻을 a55, sh1t또는 "b00bs". 당신의 문자 대체 목록은 분명히 나쁜 단어의 문자 만 포함하면됩니다.

아무도 "엉덩이"로 "455"를 읽으려고하고 있지 않기 때문에 당신은 또한 할 수 있습니다 return str에서 reducestring이 문자가 포함되어 있지 않은 경우.

그래픽 디자인 사이트 Dribbble 에는 게시물에 대한 짧은 문자열 ID가 있습니다. 이들은 http://drbl.in/dCWi 와 같이 0-9, az 및 AZ를 사용 합니다.

나는 약간의 실험을했고 적어도 몇 가지 나쁜 단어에 대한 짧은 ID가 있습니다. 우리는 그들이 언제 도착하는지 알 것 f같지만 아직 거기에 없습니다.

허가 됨- /user/whatever게시물 대신 사용자 자신의 개인 식별 URL ( )을 제공하는 것은 나쁜 단어로 인해 훨씬 ​​더 나쁩니다.


2
나는 한 번 온라인 서비스를 위해 암호를 생성하는 프로그램을 작성했습니다. 그것들은 무작위 였지만, 몇 가지 휴리스틱 (heuristics)이 있었기 때문에 그것들을 좀 더 발음하기 쉽게 만들었습니다. 그리고 이러한 휴리스틱은 욕설로 이어졌습니다. 해결책은 다음과 같습니다. 저속한 단어와 유사하게 발음 될 수있는 저속한 부분 문자열을 확인하고 (예 : FUC 및 FUK 찾기) 암호를 재생성하십시오. (웃음의 경우, 프로그램은 거부 된 암호를 별도의 파일에 썼습니다.)
kindall

1
그리고 어떻게 지구상 에서 모든 언어에 대해 그런 것을 쓸 것 입니까?
DeadMG

1
@DeadMG 가능한 모든 모욕적 인 단어의 전체 세트에 대해이 세트를 더 작게 만들 수 있습니다. 당신의 입장은 정말로 : "100 %에 도달 할 수 없기 때문에, 자동으로 아무것도 할 가치가 없습니다"?
Nicole

UTF-8은 어떻습니까? 이 대체물을 둘러싼 대체 가능한 인쇄 가능한 문자가 많이 있습니다.
JBR 윌킨슨

1
OP가 ID의 영숫자 문자 세트를 설정하기 때문에 적용되지 않는 @JBRWilkinson, 그렇지 않습니까?
Nicole

5

대신 숫자 또는 16 진수 키를 사용하십시오. i18n 인식 비속어 필터를 작성하는 것에 비해 많은 문제를 해결하고 최악의 상황은 죽은 쇠고기 입니다.


1
+1 : 이것이 가장 간단하고 안전한 솔루션이라고 생각합니다. 숫자 형식으로 uuid를 생성하고 이에 대한 문자열 표현 (10 진수, 16 진수, 8 진수)을 사용할 수 있습니다.
조르지오

4
당신은 여전히 대해 걱정할 필요가 B16B00B5P :
CodesInChaos

3

자동화 된 시스템이 사용자에게 불쾌감을주는 문자열을 생성하는 것을 막을 수는 없습니다. 예를 들어, 중국에서는 일부 숫자가 불행한 것으로 간주됩니다.

실제로 할 수있는 것은 사용자에게 자신의 ID가 무작위이며 내용이 관련이 없으며 정보가 무의미하다는 것을 알려주는 /user/fucker것입니다. 이런 일이 일어나고 욕설을 걸러 낼 수없는 것처럼 기술적으로 피할 수는 없습니다.


9
나는 downvoter가 아니지만, 나는 공격적인 말에 대해서는 "그들이 무시해야한다는 것을 말해주는 것"보다 훨씬 더 많은 일을해야한다는 것을 매우 강하게 느낍니다. 당신이 할 수있는 최소한은 생성 된 ID를 수용 가능한 것으로 변경하는 방법을 제공하는 것입니다.
Marjan Venema

4
나는 downvoter도 아니지만 @MarjanVenema에 동의합니다. / user / f * cker는 허용되지 않습니다
HappyDeveloper

@HappyDeveloper : 앞서 제안했듯이, 당신은 그것에 대해 무엇을 할 것입니까? 사용자에게 불쾌감을주는 ID가 제공되는 것을 막을 수 없습니다.
DeadMG

3
@DeadMG 일반적으로 불쾌한 몇 가지 사례를 방지하여 상황을 도울 수 있습니다 . 나는 원래의 질문이 그것을 명확하게 생각했다고 생각했다.
Nicole

2
@NickC : 유일한 예는 일반적으로 영어 로 불쾌 합니다. 아랍어, 포르투갈어, 중국어, 러시아어에서 일반적으로 불쾌감을주는 것이 무엇인지 알고 있습니까? 이러한 언어에는 많은 형태를 가진 욕설이있을 수 있습니다. 영어로 된 단어의 명백한 형태를 특별하게 표현하는 것은 쉽지만 모든 사람에게 그렇게 쉬운 것은 아닙니다.
DeadMG

2

기본적으로 사용할 수있는 두 가지 전략이 있습니다.

  1. 공격적인 문자열을 생성하지 않는 시스템을 만듭니다. 예를 들어, 자음 문자로만 ID를 작성할 수 있습니다. 모든 모음을 생략하면 시스템에서 장난이나 다른 영어 단어가 절대 생성되지 않도록 할 수 있습니다.

  2. 완전히 임의의 ID를 생성 한 후 새 ID에 공격적인 하위 문자열이 포함되어 있지 않은지 확인하십시오.


1

많은 경우 (이메일 스팸, IP 차단 등) 블랙리스트는지는 게임입니다. 발생할 수있는 모든 가능한 나쁜 일에 대해 "완전한"블랙리스트를 만들 수는 없습니다. a b c d e f

많은 사람들이 허용되는 단어의 화이트리스트를 사용하여 임의의 순서로 함께 묶습니다. (각 단어 사이에 대시 또는 점 또는 공백이있을 수 있습니다).

임의의 숫자를 발음 할 수있는 일련의 단어로 변환하는 데 사용되는 몇 가지 인기있는 사전은 다음과 같습니다.


0

무작위로 생성 된 숫자로 만들거나 불쾌한 숫자를 취소하는 정규식을 가질 수 있습니다.

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

2
웃긴 일이지만, 나는 그중 하나를 공격적으로 생각하지 않을 것입니다.
DeadMG

나는 그것은 SE 사이트에 실제 욕설을 게시 단지 민감한 주제입니다 ... 알고 meta.stackexchange.com/questions/22232/...
Billjk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.