2009-11-01 6 views
3

작은 레일 앱을 제작 중이며 추적 번호를 생성하여 고객의 상태를 확인하는 방법이 필요합니다. 주요 해운 회사가 사용하는 것과 비슷한 것을 원하지만, 오래 걸리지는 않습니다. 12-16자를 생각하면 괜찮지 만 0000000001과 같은 것을 원합니다. 사람들이 숫자를 늘리고 주변을 들여다 볼 수 있습니다.고유 한 추적 번호 생성

고유 한 숫자/문자 조합 추적 코드를 생성하는 좋은 방법은 무엇입니까?

+0

일반적인 방식으로 해시 하시겠습니까? – ukanth

+0

ID의 문자 수를 줄이려면 코드를 Base32 또는 Base64로 인코딩하십시오. – Artelius

답변

14

의미없는 데이터의 경우 시간에 해시를 더한 소금은 항상 견고하며 쉽게 추측 할 수 없습니다 (파이썬을 용서하면 이 Ruby에 대해이라고 들었지만 결코 내 손에 넣지는 않았습니다) 만약 당신이 좋아하면

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16] 
'46ffb69ebc96412d' 

가 대신 정수를 사용하지만, 길이, 당신이하지 않는 제로 패드를이 코드에 따라 변화 할 수있는 기회가 있습니다 : 만약 당신이 좋아하면

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest() 
'7a8b73fa7e0dadf246612e6001ede165' 

는 그것을 단축

이전에 617,451,515,
>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16) 
1346212029197308 

는 "ZOMG MD5는 보안 암호화하지 않다"

>>> int(hashlib.sha256(str(time.time()) + "!salt!").hexdigest()[:13], 16) 
1948411134966366 

지옥, 당신도 시간을 사용할 필요가 없습니다, 당신만큼 당신이 그것을 소금 등의 autoincrementing 정수를 사용할 수 있습니다 :

>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16) 
1269883740611281 
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16) 
3655373802716929 

해시. 아무 것도 없습니까 할 수 있습니까?

+0

고마워.이게 내가하고 싶은 일이야. – Joey

+0

@Joey : 대단히 환영합니다. 건배. –

+4

추적 번호에 어느 정도의 날짜 정보를 포함 시키려면 무작위 해시에 십진법의 유닉스 시간의 처음 몇 자리를 접두사로 붙일 수 있습니다. 처음 6 자리는 시간을 약 3 시간으로 식별합니다. 이렇게하면 추적 코드를 세미 순차적으로 만드는 효과를 얻을 수 있습니다 (예 : 레코드 정렬에 유용한 속성 제공). – Wedge

0

모든 테이블에 대해 생성 된 ID가 충분하지 않습니까? "기본값"으로 고유합니다. 하지만 대부분의 경우 단순히 표시되지 않습니다.

물론 타임 스탬프 등으로 포장 할 수 있습니다.

0

해시 맵을 사용하여 주문 정보를 저장하고 사용자에게 ID의 10 진수/16 진수 표현을 제공하는 이유는 무엇입니까? 그것은 충분히 독특합니다.

0
SELECT HEX(encode(id,'pass_str')) FROM table; 
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str'); 
0

나는 acts_as_hashed (on github)라고 불리는 이런 종류의 시나리오를 위해 플러그인을 작성했습니다. 해시 알고리즘에 사용할 필드를 지정할 수 있으며 플러그인은 crypto_hash라는 필드를 기반으로 고유 한 키를 제공합니다. 이것은 손으로하는 것보다 더 깔끔한 경향이 있으며, 앱 내에서 임의의 수의 모델과 함께 사용할 수 있습니다.