Pythonを使用してOracleのMD5ハッシュアルゴリズムを通過したハッシュを照合しようとしています。彼らのフォーラムによると、ハッシュの前にすべてがAL21UTF8でエンコードされています。
-- Prior to encryption, hashing or keyed hashing, CLOB datatype is
-- converted to AL32UTF8. This allows cryptographic data to be
-- transferred and understood between databases with different
-- character sets, across character set changes and between
-- separate processes (for example, Java programs).
--
最初はUTF-8で十分だと思いましたが、そうしてもハッシュが合わないのです。それで、さらに掘り下げた後、私はOracleのデータベースコンパニオンCDインストールガイドから述べたこの記事を見つけました:
AL32UTF8は、XMLTypeデータに適したOracleデータベースの文字セットです。これは、すべての有効なXML文字をサポートするIANA登録済みの標準UTF-8エンコーディングと同等です。
Oracle Databaseデータベースの文字セットUTF8(ハイフンなし)をデータベースの文字セットAL32UTF8またはUTF-8をエンコードする文字と混同しないでください。データベース文字セットUTF8は、AL32UTF8に置き換えられました。XMLデータにUTF8を使用しないでください。UTF8はUnicodeバージョン3.1以前のみをサポートします。すべての有効なXML文字をサポートしているわけではありません。AL32UTF8にはそのような制限はありません。
そのため、UTF-8を使用できず、Pythonのコーデックモジュールでutf-8とutf8を区別する方法がわかりません。AL32UTF8を試してみると、エラーが発生します。PythonのAL32UTF8でエンコードした人は他にいますか?
私のコーデックコードは次のようになります。
import codecs
sourceFmt = "ascii"
targetFmt = "utf8"
utfFile = "kesa_utf8.dat"
with codecs.open(old, "rU", sourceFmt) as sourceFile:
with codecs.open(utfFile, "w", targetFmt) as targetFile:
targetFile.write(sourceFile.read())
ファイル自体は次のようになります。
WC000|IC |KESA |KESA | | | |2012-07-31-15.12.36 |0090| | |\c\n
WC001|100534 |W.47212-0100534 |2012-07-31-15.12.36 | 00000000001270.00|USD|\c\n
WC002|100534 |W.47212-0100534 |Sally |H |Klass |1235 14th St. W. || |Palma Sola ||FL |USA |34209 | | | | | | | | |9412587545 | | |O | | ||20800426|645858741 |SSN | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | || | | | || | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |KESAPC | | | | | |N| | | || | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |\c\n
WC999|1000000000|1000000000|4000000000|
ハッシュは86D993FA7121E3B9EE1657A23345FE21である必要があります
とにかく、私はhashlibを使用してそれをハッシュします:
import hashlib
with open(path) as f:
data = f.read()
mdhash = hashlib.md5(data)
mdhash = mdhash.hexdigest()
print mdhash
その結果、8421877dd9cdf7235eec47765821998cになります