- 긴 문자열을 6자리 해시로 변환하기
JavaScript에서 긴 문자열을 6자리 해시로 변환하는 방법 중 하나는 SHA-256 등의 안전한 해시 알고리즘을 사용하고 그 결과를 base64 또는 다른 방법으로 인코딩하는 것이다. 하지만 SHA-256은 256비트의 해시 값을 생성하기 때문에 6자리 해시를 얻기 위해서는 이를 잘라야 하고, 이는 보안에 취약할 수 있다.
이번 글에서는 CRC32라는 테이블을 만들어 긴 문자열을 6자리 해시로 줄여볼 것이다. 그러나 이는 충돌 가능성이 있으며 보안적으로 안전하진 않아 간단한 문자열 체크섬 또는 일부 문자열 검증 용도로 사용하면 좋다.
// CRC32 테이블 생성
const crcTable = new Uint32Array(256);
for (let i = 0; i < 256; i++) {
let crc = i;
for (let j = 0; j < 8; j++) {
crc = (crc & 1) ? (crc >>> 1) ^ 0xEDB88320 : crc >>> 1;
}
crcTable[i] = crc;
}
// CRC32 계산 함수
function crc32(str) {
let crc = 0xFFFFFFFF;
for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
crc = (crc >>> 8) ^ crcTable[(crc ^ char) & 0xFF];
}
return (crc ^ 0xFFFFFFFF) >>> 0; // unsigned
}
// 6자리 해시 생성 함수
function to6DigitHash(str) {
const crc = crc32(str).toString(16); // CRC32 값을 16진수 문자열로 변환
return crc.slice(0, 6); // 처음 6자리만 반환
}
// 테스트
const hash = to6DigitHash("Your long string here");
console.log(hash); // 출력 예시: "1be4a9"
위 코드는 1) CRC32 테이블을 생성하고, 2) 이를 사용하여 CRC32 값을 계산하고, 3) CRC32 값을 16진수 문자열로 변환한 후 처음 6자리를 반환한다. 테스트 코드를 실행하면 6자리 해시가 출력된다.