広告

【プチネタ】クエリ生成した値でMD5CryptoServiceProviderを使ったハッシュ値変換をやると、戻り値が揺らぎまくる件

はい、来ました!これはブログを作った時から、絶対に『ネットの大海に投げ入れておくべき小瓶』と思っていたネタです。超超超超ニッチだけど、いつかどこかで同じ現象にぶち当たった人へ流れつきますように。

MD5CryptoServiceProviderについてはこちら(Microsoftのページ)

MD5CryptoServiceProviderを使って文字列をハッシュ値に変換する時に、こんな事象が起きた!

  1. テーブルを直にレコードセットで開き、フィールドの値(当該のケースでは複数フィールドの値を「&」結合)を渡せば、毎回安定した結果が得られます。つまり、テーブルに保存されていた同じ文字列を渡せば、何回やっても同じハッシュ値が返ります。
  2. ところがレコードセットで【参照クエリ】を開き、フィールド上の値を関数で加工してから「&」結合した値をMD5CryptoServiceProviderに渡してハッシュ値変換すると、「毎回およそ半数のレコードで、返されるハッシュ値が異なる!しかもやり直すたびに違うハッシュ値が返ってくる!」という恐怖な現象が起きました。MD5CryptoServiceProvider に渡している文字列を、デバッグプリントで書き出してみると、戻りハッシュ値がブレまくるレコードの場合、255文字を超えた辺りから文字化けが発生していました。(ちなみに関数による加工内容は、文字列型フィールドの値に対し、改行マークやスペースをReplace関数で取り除くものです。)

原因はわからないけど解決した方法

  • 当時調べても明確な情報が無く、原因はわかりませんでした。
  • ①毎回同じハッシュ値が得られている既存機能
  • ②既存機能を私がコピペ&改修して、ハッシュ値の半数が乱れまくっている新設の機能
  • ①と②で【異なっている箇所はどこなのか?】を確認した結果、レコードセットで開いているオブジェクトの種類①はテーブル②は参照クエリ、と異なっていました。
  • そこで、②の方も、関数で加工した値を一旦テーブルに保存するプロセスを作り、そのテーブルをレコードセットで直接開く方式に変えてみたところ、毎回同じハッシュ値が返るようになり、解決に至りました。
  • もし同じような状況で困っていたら確認してみてください。