2010-01-20 4 views
1

클라이언트와 나는 (데이터베이스에 의해 생성 된) 숫자 사용자 ID로부터 사용자 이름을 생성하는 방법에 대해 브레인 스토밍했다. 핵심 요구 사항은 사용자 이름이 고유하다는 것입니다.정수를 사용자 이름에 매핑하기

가장 확실한 해결책은 사용자 이름과 동일한 사용자 이름을 설정하는 것입니다. 그러나 중요한 요구 사항은 사용자 이름이 "분명히 순차적"이 아니기 때문에 사용자 ID가 4000400140024003 일 수는 있지만 클라이언트는 사용자가 사용자 이름에서 해당 진행을 볼 수 없도록합니다. 숫자가 결국 사용됩니다.

사용자 이름의 길이가 작기 때문에 바람직합니다. 즉, 사용자 ID가 길이가 커지는 데 필요한 지점에 도달 할 때까지 길이가 증가하지 않는 것이 좋습니다.

제안 사항?

편집 : 답변의 대부분은 메커니즘의 보안을 중요한 건데요 것으로 가정 한 가 없습니다. 클라이언트는 사용자 이름에서 "상위"구성원이 누구인지 분명하게 알기를 원하지 않습니다.

사용자 이름의 주요 목표는 기억하기 쉽기 때문에 긴 해시는 좋지 않습니다.

영숫자는 괜찮지 만 클라이언트는 잠재적으로 "잘못된"사용자 이름을 할당하는 것에 대해 우려하고 있습니다. fpq321은 괜찮을 것이고, ass123은 그렇지 않을 것입니다. 이것들은 사용자의 공개 "핸들"이 될 것입니다.

+0

왜 순차적 일 수 없습니까? 그들이 추측 당하지 않도록하려면? – RossFabricant

+0

나는 심리적 인 문제보다는 보안 문제가 덜하다고 생각한다; 그들은 사용자가 더 높고 (따라서 더 나쁜) 사용자 이름을 가지기 때문에 사용자가 덜 중요하거나 늦게 느끼길 바라지 않습니다. – justkevin

답변

1

GUID 사용을 고려 했습니까? 꽤 길지만 오버랩을 얻지는 못합니다. MD5 해시는 어떨까요?

1

읽을 필요가없는 경우 MD5 또는 유사한 해시를 사용할 수 있습니다. 항상 같은 길이를 출력하고 "결코"충돌을 일으키지 않습니다. 나는 물론 "절대"라는 말을 느슨하게 사용합니다.

그래도 잘 작동해야합니다.

+0

MD5 위에 HMAC을 던지면 더 안전합니다. 간단한 정수로 MD5를 사용하는 것에 조심해야합니다. 최소한 접두사 나 접미사가 필요합니다. 모든 32 비트 int에는 MD5 무지개 테이블이 꽤 많이 있습니다. "암호 복구"를 전문으로하는 검색 엔진조차도 밀리 초 단위로 int의 MD5를 바꿀 수 있습니다. – pestilence669

1

가능한 접근 방식은 사용자 ID에 해시 함수를 실행하는 것입니다. 순차적 프로빙을 사용할 수 있습니다. 예를 들어 사용자 ID가 300으로 해시되었지만 이미 사용 중이면 301, 302, 303을 차례로 확인합니다.

4

나는 단어 목록에서 임의의 단어 + 임의의 숫자를 선택하는 경향이 있습니다. 당신이 유일한 것이없는 경우에 & 반복하십시오. 특히 크기가 큰 두 단어 목록을 사용하는 경우 충돌이 거의 발생하지 않습니다.예를 들어 :

단어 목록

  • 탄고
  • 브라보 (예위한 명사)
  • 알파

단어 목록 B (형용사 또는 동사)

  • 대규모
  • 영광스러운
  • 더러워

그래서, 몇 가지 예 "DisgustingTango1208"것,이 방법 등의 장점 "GloriousAlpha1912", "MassiveAlpha15는"단어가 있다는 것입니다 사용자가 훨씬 쉽게 기억할 수 있습니다. 숫자를 낮게 유지하는 한 문제는 16+ 영숫자 문자보다 훨씬 적습니다.

이것이 길이/성장 요구 사항을 충족시키지 못한다는 것을 알고 있지만이를 수행하면 시퀀스의 선형성에 대한 통찰력을 얻을 수 있습니다 (1,000 범위 내에서). 따라서, 1000 번의 무차별 대입 시도로 ID #를 파생시킬 수 있습니다.

1

정수를 약간 변형 할 수 있습니다. 즉, 바이트를 다시 정렬합니다. 바이트 3을 바이트 1로 스왑하고, 바이트 4를 바이트 2로 스왑하고 등을 사용자 이름으로 사용합니다. 그것이 반드시 작은 숫자에서 더 큰 숫자를 만들기 때문에 (실제로 컴팩트하게 유지하지는 않지만). 같은

예를 들어 뭔가 :

BYTE b1 = i&0xFF; 
BYTE b2 = (i>>8)&0xFF; 
BYTE b3 = (i>>16)&0xFF; 
BYTE b4 = (i>>24)&0xFF; 

int nTransformed = (b2<<24) | (b1<<16) | (b3<<8) | b4; 

그것은 그들이 고유하지만 분명히 순차적하지 유지합니다. 사용자 ID 짧게 사용자 이름을 유지하려면

1

, 당신은 같은 것을 할 수 있습니다 이

<?php 
// function generates (always the same) username from an ID 
function get_username($id){ 
    $i=0; 
    $return=null; 
    // define some strings used to generate the usernames (must be 10 chars long) 
    $string1=str_split('abcdefghij'); 
    $string2=str_split('KLMNOPQRST'); 
    $string3=str_split('3274190258'); 
    $string4=str_split('ANYSTRINGY'); 
    $string5=str_split('TENCHARSLO'); 
    if($splitted=str_split($id)){ // split username 
     foreach($splitted as $i => $char){ // loop trough each number of uses_id 
      if($i==0) $return .= $string1[(intval($char))]; // 1st char is picked from $sting1 
      elseif($i==1) $return .= $string2[(intval($char))]; 
      elseif($i==2) $return .= $string3[(intval($char))]; 
      elseif($i==3) $return .= $string4[(intval($char))]; 
      else $return .= $string5[(intval($char))]; // from 5 chars, pick from sting 5 
     } 
    } 
    return (!empty($return))?$return:false; // return username or false if argument is empty 
} 
get_username(45879); 
?> 
0

(그냥 [문자] [간판] [다른 숫자]로 번호를 대체합니다) 이 문제의 일반적인 해결책은 사용자가 자신의 사용자 이름을 선택하고 기본 키로 사용되는 사용자 ID와이를 연관시키는 것입니다.

관련 문제