
チェックデジットとは
データをチェックするためデジット(数字)
例えば以下のように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進数チェックデジットを生成するコードは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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() }) |