Sqids은(는) 숫자에서 짧고 고유하며 무작위로 보이는 ID를 생성할 수 있는 작은 오픈 소스 라이브러리입니다.
가장 좋은 방법은 10진수에서 16진수 변환기처럼 생각하는 것인데 몇 가지 추가 기능이 있는 것으로 생각하시면 됩니다.
링크 단축, 로깅을 위한 고유 이벤트 ID 생성, 웹 사이트의 제품/객체에 대한 ID 생성(예: YouTube에서 비디오에 대해 수행하는 것처럼), 텍스트 메시지를 위한 짧은 ID 생성, 이메일의 확인 코드 등에 사용됩니다.
민감한 데이터가 아닌 모든 데이터입니다. 생성된 ID는 해시가 아니며 숫자로 다시 디코딩될 수 있습니다. 예를 들어, 사용자 ID에 좋은 선택이 아닐 수 있습니다. 왜냐하면 한 번 디코딩되면 앱의 사용자 수를 드러낼 수 있기 때문입니다.
네, Sqids은(는) 하나 또는 여러 개의 음수가 아닌 숫자를 하나의 ID로 인코딩할 수 있습니다. 인코딩할 수 있는 숫자의 개수에는 제한이 없지만 인코딩할 수 있는 숫자의 크기에는 제한이 있습니다(구현 언어에 따라 다릅니다).
여러 이유로 유용합니다: UNIX 타임스탬프를 인코딩하여 만료되는 ID를 생성하거나 데이터베이스 샤드 번호와 주 키를 함께 인코딩하여 추가 데이터베이스 쿼리를 절약할 수 있습니다.
네, 생성된 ID는 입력과 알파벳에 대해 고유합니다.
기본 알파벳에는 대문자와 소문자가 모두 포함되어 있기 때문에 기본 ID는 대소문자를 구분합니다.
Sqids은(는) 음수를 인코딩할 수 없습니다.
최소 알파벳 길이는 3자입니다.
알파벳에는 다중바이트 문자가 포함될 수 없습니다.
Sqids은(는) 특정 길이까지 ID를 생성할 수 없고, 최소한 특정 길이만큼은 생성합니다. 최소 길이 매개변수 범위는 0부터 255입니다.
Sqids은(는) 알파벳 길이에서 하나를 뺀 만큼까지 ID를 재생성할 수 있습니다.
라이브러리는 사용자 정의 알파벳을 받아 ID를 생성할 수 있습니다. 제공된 기본 알파벳을 미리 섞으면 됩니다.
충분한 노력을 기울인다면 누군가가 섞인 알파벳을 역으로 분석할 수 있으니, 이는 민감한 데이터를 숨기는 기술이 아닙니다.
사용 사례에 따라 다릅니다. 더 짧은 알파벳은 더 긴 ID를 생성하고, 더 긴 알파벳은 더 짧은 ID를 생성합니다. 플레이그라운드 를 사용하여 ID의 모양을 테스트할 수 있습니다.
네, 생성된 ID는 여전히 문자열이며 0으로 시작할 수 있습니다.
아니요, Sqids은(는) 알파벳에 다중바이트 문자를 지원하지 않습니다. 이모지와 많은 다른 문자를 포함합니다.
라이브러리는 ID를 더 길어 보이도록 쓰레기 문자로 확장할 수 있습니다. 이는 1과 같은 작은 숫자 또는 1000000와 같은 큰 숫자를 인코딩하는지 명확하지 않게 만드는 데 유용합니다.
디코딩은 영향을 받지 않습니다.
네, 라이브러리는 최소 길이 매개변수를 받아들여 ID가 최소한 해당 길이가 되도록 보장합니다.
ID의 길이에 대한 보장은 없으며, 지정한 길이보다 짧지 않을 뿐입니다.
어느 정도까지입니다.
최대 길이를 설정하는 것은 불가능합니다. 충분히 큰 입력이 주어지면 언젠가는 ID가 오버플로될 것입니다. 그래서 최소 길이 매개변수만 지원되며 정확한 길이나 최대 길이는 지원하지 않습니다.
차단 목록은 특정 단어가 ID에 표시되는 것을 방지할 수 있습니다. 생성된 ID는 URL과 같은 곳에 나타나는 것이 목적이므로 이것은 유용합니다.
Sqids에는 기본 차단 목록 이 함께 제공됩니다. 이 목록에는 여러 언어의 가장 기본적인 저속하거나 부적절한 단어가 포함되어 있습니다. 물론 사용자는 자신의 단어로 해당 목록을 확장할 수 있습니다.
차단 목록 단어 일치는 대소문자를 구분하지 않습니다.
3자 미만인 짧은 단어는 차단되지 않습니다. 3자인 단어는 ID와 정확하게 일치해야 합니다. 4자 이상인 단어는 ID의 부분 문자열이면 일치가 발생합니다.
차단 목록 단어에 숫자(릿스픽)가 포함된 경우, ID의 시작이나 끝에 있을 때만 일치를 발생시킵니다.
기본 차단 목록에는 여러 언어의 가장 흔한 저속하거나 부적절한 단어가 포함되어 있습니다. 전체 목록은 여기 에서 확인할 수 있습니다.
생성된 ID가 차단 목록의 단어와 일치하는 경우, 라이브러리는 재생성을 시도합니다.
모든 시도가 실패하여 ID를 재생성할 수 없는 경우, 인코딩 함수는 실패하고 오류를 반환합니다. 이 오류 처리는 사용자에게 달려 있습니다.
재생성 시도 횟수를 줄이는 가장 좋은 방법은 더 긴 알파벳을 가지고, 최소 길이를 설정하지 않고, 더 작은 차단 목록을 제공하는 것입니다. 빈 차단 목록을 제공하면 이 기능이 완전히 비활성화됩니다.
ID를 디코딩하면 일반적으로 숫자 출력이 생성됩니다. 그러나 이는 반드시 ID가 정규적인 것을 의미하지는 않습니다. ID가 유효한지 확인하려면 디코딩된 숫자를 다시 인코딩하여 ID가 일치하는지 확인할 수 있습니다.
이것이 자동으로 수행되지 않는 이유는 기본 차단 목록이 미래에 변경될 경우, 과거에 생성된 ID를 자동으로 무효화하고 새로운 차단 목록 단어와 일치할 수 있기 때문입니다.
기본 차단 목록이 변경되면 CHANGELOG을 업데이트할 것입니다.
기본 차단 목록에 새로운 단어가 추가될 수 있는 시나리오를 고려해야 합니다. 이 경우, 숫자를 다시 인코딩하면 다른 ID가 생성될 수 있습니다.
미래 업데이트에서도 ID가 일관되게 유지되는 가장 좋은 방법은 현재 기본 차단 목록과 동일한 사용자 정의 차단 목록을 제공하는 것입니다.
아니요, 다른 숫자를 인코딩하면 고유한 ID가 생성됩니다.
그러나 알고리즘 설계 때문에 무작위 ID를 디코딩하면 때때로 동일한 숫자를 생성할 수 있습니다. ID가 정규적인지 확인하는 가장 좋은 방법은 간단히 디코딩된 숫자를 다시 인코딩하여 ID가 일치하는지 확인하는 것입니다.
Hashids는 이 라이브러리의 처음 버전으로 2013년경에 나왔습니다. 약간 다른 방법을 사용하여 짧은 ID를 생성했습니다.
Hashids는 몇 가지를 다르게 처리했습니다.
사용자 정의 차단 목록을 지원하지 않았지만, 대신 가장 흔한 영어 저속한 단어들에 의존했습니다. 또한 알파벳을 섞기 위해 salt 매개변수를 사용했는데, 이는 라이브러리가 암호화와 아무 관련이 없어서 약간 혼란스럽게 만들었습니다. 추가로, 너무 많은 예약된 문자들을 사용하여 더 긴 ID를 생성하는 결과를 가져왔습니다.
그래서 우리는 업그레이드하고 다시 브랜드를 바꾸기로 결정했습니다. 알고리즘을 단순화했고, 몇 가지 기능을 추가했으며, 모든 코드 저장소가 이제 한 곳에 있습니다 .
salt 매개변수는 알파벳을 섞기 위해 사용되었고, 이는 보안이나 안전과 관련되어 있지 않았습니다. Hashids와 Sqids 모두 10진수에서 16진수로의 변환과 비슷한 방식으로 작동하지만 몇 가지 조정이 있습니다. 어떠한 암호화도 없으므로 혼란을 피하기 위해 이 매개변수는 완전히 제거되었습니다.
아니요, Sqids은 Hashids의 기능을 확장하고 다른 설계 목표와 요구 사항을 갖고 있기 때문에 생성된 ID는 Hashids와 호환되지 않습니다.
Hashids와 Sqids 간에 호환성이 없으므로 Hashids를 간단히 Sqids으로 대체하는 것은 불가능합니다.
하지만 두 라이브러리를 병합할 수 있습니다. 어떤 ID가 어떤 라이브러리에 속하는지를 구분하는 방법 중 하나입니다.
이를 위한 한 가지 방법은 ID 길이를 기준으로 하는 것입니다 - Sqids으로 변경하는 경우 더 높은 최소 길이를 제공할 수 있습니다. 또 다른 방법은 새로 생성된 ID에 수동으로 사용자 정의 문자를 추가/접두사로 붙이는 것입니다.
마지막으로 Hashids로 ID를 디코딩하여 유효한지 확인할 수도 있습니다. 그렇지 않다면 - 디코딩 후 Sqids으로 다시 인코딩하여 확인할 수 있습니다.
이 웹사이트의 각 언어 구현은 원래의 Hashids 저장소에 대한 링크를 제공합니다.
프로젝트를 지원하고 싶으시면 Github에서 저희 저장소에 스타를 부탁드립니다. 이렇게 하면 더 많은 관심을 받을 수 있습니다.
개발자이며 특정 언어에 Sqids의 구현이 없는 경우 라이브러리를 변환하는 데 도움을 주실 수 있습니다. 프로그래밍 언어가 나열되지 않은 경우도 동일합니다.
스펙 또는 구현 중 하나에서 버그를 발견한 경우 해당 저장소에 제안된 수정 사항으로 이슈를 생성하거나 풀 리퀘스트를 만들어주시기 바랍니다.
여러 언어를 구사하시는 경우 차단 목록을 세밀하게 조정하는 데 와 웹사이트 번역을 조정하는 데 도움이 필요합니다.
마지막으로, Hashids/Sqids에 대한 경험이 있으시면, 누군가의 질문에 답변하여 커뮤니티를 안내하는 데 도움을 주실 수 있습니다.