1分でわかるJavaScriptでの32進数チェックデジット生成方法

チェックデジットとは

データをチェックするためデジット(数字)

例えば以下のように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()
})

32進数チェックデジット生成サンプル