我想对oracle表的blob数据进行哈希处理。我看到了两个选择:使用 DBMS_CRYPTO 在数据库中执行此操作,或者编写一个处理器,该处理器将抛出所有 blob、获取流并使用 md5 对它们进行哈希处理。哈希本身将转到另一个表,该表具有指向将 blob 数据存储为文件内容的表的外键。有些文件超过 100mb。理论上我可以小批量处理它们,但即使我只处理批量大小 10,也不确定内存效率。 P.s 有近 20k blob 数据需要进行哈希处理
对 Oracle 表中的 BLOB 数据进行哈希处理有两种主要方法:使用 Oracle 的
DBMS_CRYPTO
包直接在数据库中执行此操作,或者编写一个外部处理器来读取 BLOB、对它们进行哈希处理(使用 MD5 之类的方法)并存储哈希值在一个单独的表中。每种方法都有其优点和缺点,因此最佳选择实际上取决于您优先考虑的内容 - 性能、内存效率或可扩展性。
DBMS_CRYPTO
DECLARE
v_hash_value RAW(32);
BEGIN
FOR rec IN (SELECT id, blob_column FROM your_blob_table) LOOP
v_hash_value := DBMS_CRYPTO.Hash(UTL_RAW.CAST_TO_RAW(rec.blob_column), DBMS_CRYPTO.HASH_MD5);
INSERT INTO your_hash_table (id, hash_value)
VALUES (rec.id, v_hash_value);
COMMIT;
END LOOP;
END;
/
using System;
using System.Data.OracleClient;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
string connString = "your_connection_string";
using (var connection = new OracleConnection(connString))
{
connection.Open();
var command = new OracleCommand("SELECT id, blob_column FROM your_blob_table", connection);
var reader = command.ExecuteReader();
while (reader.Read())
{
var id = reader["id"];
var blob = reader["blob_column"] as byte[];
if (blob != null)
{
string hash = ComputeMD5Hash(blob);
var insertCommand = new OracleCommand("INSERT INTO your_hash_table (id, hash_value) VALUES (:id, :hash_value)", connection);
insertCommand.Parameters.Add(new OracleParameter("id", id));
insertCommand.Parameters.Add(new OracleParameter("hash_value", hash));
insertCommand.ExecuteNonQuery();
}
}
}
}
static string ComputeMD5Hash(byte[] data)
{
using (var md5 = MD5.Create())
{
byte[] hashBytes = md5.ComputeHash(data);
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
}
dbms_lob
包以较小的块处理大 BLOB,这有助于管理内存使用情况。DBMS_CRYPTO
。