
チェックデジットとは
データをチェックするためデジット(数字)
例えば以下のようにAさんのシリアルコードが12345678でBさんのシリアルコードが12335678だとする。
この場合Aさんが1桁間違えて12335678と入力するとBさんのシリアルコードを間違えて登録してしまう。
チェックデジットを使用するとこのような間違いを回避できる。
チェックデジットの算出方法は色々あるが、例えば1〜7の桁を足して合計の最後の桁を語尾に付けるやり方の場合は1+2+3+4+5+6+7=28で12345678となり1233567の場合は1+2+3+3+5+6+7=27となり12335677となるため、このやり方で作成されたランダムなシリアルコードは2箇所以上の数字が異なることが多い。
32進数チェックデジット生成方法
前述のシリアルコードは8桁の10進数のため、適当な数字を入力すると偶然一致してしまう可能性がある。
桁数を増やせば偶然一致する可能性は減るが、ユーザーが入力する手間が増えるというデメリットが発生してしまう。
そのため、シリアルコードは10進数ではなく32進数で生成したほうが良い。
10進数は8桁だと10の8乗で100000000通りだが、32進数だと8桁だと32の8乗で1099511627776通りとなるため偶然一致の可能性はかなり低くなる。
JavaScriptで32進数チェックデジットを生成するコードは以下の通り。
const t = document.getElementById('t') const b = document.getElementById('b') const r = document.getElementById('r') function checkDigit() { const s = t.value.trim() if (s.length > 7) { r.textContent = '入力は7桁以下でお願いします。' return } const n = parseInt(s, 36) const x = String(n).split('').reduce((a, b) => { return parseInt(a, 10) + parseInt(b, 10) }) r.textContent = n.toString(36) + x.toString(36).slice(-1) } t.addEventListener('input', () => { checkDigit() }) b.addEventListener('click', () => { t.value = Math.floor(Math.random() * 32**7).toString(32) checkDigit() })