ハッシュ化(文字列を一意の値に変換)
Excel VBAで「ハッシュ化」とは、文字列やデータを 一意の数値や文字列に変換する処理 のことです。
パスワードの保存やデータの照合、重複チェックなどに使われます。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- ハッシュ化とは?
入力データを一定のアルゴリズムで「固定長の値」に変換すること。 - 用途:
- パスワードを直接保存せず、ハッシュ値で管理。
- データの改ざんチェック。
- 重複判定(同じ文字列なら同じハッシュ値)。
- 注意:
- VBA標準にはハッシュ関数はない。
- Windowsの暗号化APIや簡易的な自作関数を利用する。
テンプレ1:簡易ハッシュ(文字コードの合計)
初心者向けに「文字コードの合計」をハッシュ値として使う簡易例です。
Function SimpleHash(text As String) As Long
Dim i As Long, sumVal As Long
For i = 1 To Len(text)
sumVal = sumVal + Asc(Mid(text, i, 1))
Next i
SimpleHash = sumVal
End Function
Sub Example_SimpleHash()
Dim s As String: s = "ABC"
MsgBox "文字列=" & s & vbCrLf & "ハッシュ値=" & SimpleHash(s)
End Sub
VB- 結果:
"ABC"→198(65+66+67) - ポイント: 簡易的なので衝突(異なる文字列が同じ値になる)が起こりやすい。
テンプレ2:MD5ハッシュ(Windows API利用)
より本格的に「MD5」などの暗号学的ハッシュを使う場合は、Windowsの暗号化APIを利用します。
以下は簡易的なMD5ハッシュ取得例です。
' 参照設定で「Microsoft XML, v6.0」を有効にする
Function MD5Hash(text As String) As String
Dim enc As Object, bytes() As Byte, hash As Object
Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
bytes = StrConv(text, vbFromUnicode)
hash = enc.ComputeHash_2(bytes)
Dim i As Long, result As String
For i = 1 To LenB(hash)
result = result & LCase(Right("0" & Hex(AscB(MidB(hash, i, 1))), 2))
Next i
MD5Hash = result
End Function
Sub Example_MD5()
Dim s As String: s = "password123"
MsgBox "文字列=" & s & vbCrLf & "MD5ハッシュ=" & MD5Hash(s)
End Sub
VB- 結果例:
"password123"→482c811da5d5b4bc6d497ffa98491e38 - ポイント: MD5は高速だがセキュリティ用途には弱い。
テンプレ3:SHA1ハッシュ(XMLオブジェクト利用)
Function SHA1Hash(text As String) As String
Dim xml As Object, bytes() As Byte
Set xml = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
bytes = StrConv(text, vbFromUnicode)
Dim hash As Object: Set hash = xml.ComputeHash_2(bytes)
Dim i As Long, result As String
For i = 1 To LenB(hash)
result = result & LCase(Right("0" & Hex(AscB(MidB(hash, i, 1))), 2))
Next i
SHA1Hash = result
End Function
Sub Example_SHA1()
Dim s As String: s = "hello"
MsgBox "文字列=" & s & vbCrLf & "SHA1ハッシュ=" & SHA1Hash(s)
End Sub
VB- 結果例:
"hello"→aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
テンプレ4:ハッシュ化で重複チェック
Sub Hash_DuplicateCheck()
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim data As Variant
data = Array("apple", "banana", "apple", "orange")
Dim s As Variant, h As String
For Each s In data
h = MD5Hash(s)
If dict.Exists(h) Then
Debug.Print s & " は重複"
Else
dict(h) = True
End If
Next s
End Sub
VB- ポイント: ハッシュ値をキーにすれば高速に重複チェック可能。
例題で練習
'例1:簡易ハッシュ
Sub Example1()
Example_SimpleHash
End Sub
'例2:MD5ハッシュ
Sub Example2()
Example_MD5
End Sub
'例3:SHA1ハッシュ
Sub Example3()
Example_SHA1
End Sub
'例4:重複チェック
Sub Example4()
Hash_DuplicateCheck
End Sub
VB初心者向けポイント
- 簡易ハッシュは練習用 → 実務ではMD5やSHAを使う。
- MD5/SHAは暗号学的ハッシュ → 同じ文字列なら必ず同じ値になる。
- Dictionaryと組み合わせると便利 → 重複チェックやデータ照合に最適。
- セキュリティ用途ではSHA2以上推奨 → MD5やSHA1は古い。
👉 この「ハッシュ化テンプレ」を覚えておけば、Excel VBAで データの一意化・重複チェック・簡易的なセキュリティ処理 を実務に応用できます。
