C#에서 주민등록번호 맨 뒷자리에 대한 검증 알고리즘 예제 자료를 안내해드리겠습니다.
주민등록번호 검증 규칙
주민등록번호 검증과 관련하여 주민등록번호의 연혁을 알아보도록 하겠습니다. 지금까지 총 3회의 역사가 있습니다. 첫 번째는 주민등록번호 최초 도입(1968년 9월 ~1975년 10월), 그리고 오늘 알아볼 주제인 검증규칙이 있는 주민등록번호체계(1975년 10월 ~ 2020년 10월), 마지막으로 2020년 10월부터 검증규칙이 폐지된 주민등록번호입니다. 작성일자를 기준으로 신규 주민등록번호를 발급받은 아이들은 4살 정도 되었겠군요.
주민등록번호 최초 도입 (1968년 9월~)
1968년 9월 주민등록번호가 최초로 도입되었을 때에는 등록번호 앞자리가 지역번호였고 뒷자리는 현재와 같이 첫 째자리가 성별 구분, 그 다음은 일련번호였습니다. 예시 자료는 110101-123456입니다.
- 110101 => 앞자리 6자리는 지역번호 읍면동 번호 6자리를 사용합니다.
- 1 => 뒷자리 첫 째자리는 성별입니다. 현재에도 유효한 규칙으로 숫자에 따라 성별을 알 수 있습니다. (남자 1, 여자 2)
- 23456 => 성별 자리 이후에는 일련번호가 발급되었습니다. 주민등록번호를 최초로 발급받은 박정희 대통령은 뒷자리가 100001입니다. (일련번호 1)
주민등록번호 검증번호 추가 (1975년 10월~)
1975년 10월부터 새로 검증번호가 추가되어 도입된 주민등록번호 검증체계입니다. 오늘 주제는 이 주민등록번호와 관련이 있습니다. 제 주민등록번호 또한 이 규칙에 속합니다. 예시자료는 820701-2345678 입니다.
- 820701 => 생년월일을 뜻합니다. 1982년 7월 1일이 생일인 것을 알 수 있습니다.
- 2 => 주민등록버놓 뒷 자리 첫 째자리는 종전과 동일하게 성별을 나타냅니다.
1 => 1900년생 남성
2 => 1900년생 여성
3 => 2000년생 남성
4 => 2000년생 여성
5 => 1900년생 외국인 남성
6 => 1900년생 외국인 여성
7 => 2000년생 외국인 남성
8 => 2000년생 외국인 여생 - 3456 => 읍, 면, 동 고유번호
- 7 => 신고순서에 따른 일련번호로 1부터 9까지입니다. 웬만하면 1인데 쌍둥이이거나, 신고 건수가 많다면 2 또는 3일 수도 있습니다. 저희 집은 모두 1이네요.
- 8 => 주민등록번호 검증번호입니다. 앞의 12자리 숫자를 산식에 따라 산출한 결과를 기입합니다. 반대로 말하자면, 이 값을 역산한 값이 검증 규칙에 불일치하는 경우 주민등록번호를 허위로 작성하였거나 오기입한 경우라 할 수 있습니다.
2020년 10월생 주민등록번호 규칙 (2020년 10월~)
2020년 10월부터 검증 규칙이 폐지되었습니다. 앞으로 어떻게 갈지는 모르겠으나, 2020년 10월생부터는 검증규칙을 제외하도록 추가해야 합니다.
주민등록번호 검증 알고리즘 (체크섬)
주민등록번호 검증번호는 다음과 같습니다. 주민등록번호 앞자리 12자리까지의 값을 ABCDEF-GHIJKL 이라고 할 때에 다음과 같이 구합니다. 나눈값의 나머지를 MOD라 하겠습니다.
검증번호 = ( 11 - (2A+3B+4C+5D+6E+7F+8G+9H+2I+3J+4K+5L)MOD(11) )MOD(10)
다음과 같이 주민등록번호를 검증해 볼 수 있습니다.
검증하려는 번호 13자리를 입력해 주세요
검증번호 :
<!DOCTYPE html>
<html>
<head>
<style>
#btnCheckSumBeomSang {
padding: 12px 24px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
#btnCheckSumBeomSang:hover {
background-color: #3e8e41;
}
</style>
<script>
function checkSumBeomSang() {
var inputBeomSang = document.getElementById("inputBeomSang").value;
clearResultBeomSang();
if (inputBeomSang.length !== 13 || isNaN(inputBeomSang)) {
document.getElementById("resultBeomSang").innerHTML = "없음";
document.getElementById("result2BeomSang").innerHTML = "검증할 번호 13자리를 입력해 주세요.";
return;
}
var weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
var sum = 0;
for (var i = 0; i < inputBeomSang.length - 1; i++) {
var digit = parseInt(inputBeomSang[i]);
sum += digit * weights[i];
}
var checkSum = 11 - (sum % 11);
if (checkSum == 10) {
checkSum = 0;
} else if (checkSum == 11) {
checkSum = 1;
}
document.getElementById("resultBeomSang").innerHTML = checkSum;
document.getElementById("result2BeomSang").innerHTML = (checkSum == inputBeomSang[12]) ? "검증번호와 입력 번호의 마지막 자리가 일치합니다." : "검증번호와 입력 번호의 마지막 자리가 일치하지 않습니다.";
if (checkSum != inputBeomSang[12]) {
document.getElementById("result2BeomSang").style.color = "red";
} else {
document.getElementById("result2BeomSang").style.color = "blue";
}
}
function clearResultBeomSang() {
document.getElementById("resultBeomSang").innerHTML = "";
document.getElementById("result2BeomSang").innerHTML = "";
}
</script>
</head>
<body>
<p>검증하려는 번호 13자리를 입력해 주세요
<br><br><input type="text" id="inputBeomSang" pattern="\d{13}" oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 13); clearResultBeomSang();" maxlength="13"><br><br>
<button id="btnCheckSumBeomSang" onclick="checkSumBeomSang()">검증</button>
<br><br>검증번호 : <span id="resultBeomSang"></span>
<br><br><span id="result2BeomSang"></span></p>
</body>
</html>
C#으로 하는 예제자료는 다음과 같습니다.
void BeomSang()
{
var inputBeomSang = "9912311999999";
string resultBeomSang = string.Empty;
if (inputBeomSang.Length != 13 || !long.TryParse(inputBeomSang, out long result))
{
resultBeomSang = "검증할 번호 13자리를 입력해 주세요.";
return;
}
int[] weights = { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };
long sum = 0;
for (int i = 0; i < inputBeomSang.Length - 1; i++)
{
int digit = int.Parse(inputBeomSang[i].ToString());
sum += digit * weights[i];
}
int checkSum = 11 - (int)(sum % 11);
if (checkSum == 10)
{
checkSum = 0;
}
else if (checkSum == 11)
{
checkSum = 1;
}
resultBeomSang = checkSum == int.Parse(inputBeomSang[12].ToString()) ? "검증번호와 입력 번호의 마지막 자리가 일치합니다." : "검증번호와 입력 번호의 마지막 자리가 일치하지 않습니다.";
Debug.WriteLine(resultBeomSang);
}