Ваше самое важное требование должно "проверить если измененное содержание".
, Если это самый важный, что ЛЮБОЕ изменение в файле быть обнаруженным, MD-5, SHA-1 или даже SHA-256 должно быть Вашим выбором.
, Учитывая, что Вы указали, что контрольная сумма НЕ быть криптографически хорошим, я рекомендую CRC-32 по трем причинам. CRC-32 дает хорошие расстояния Хемминга по 8K файлу. CRC-32 будет, по крайней мере, порядком величины быстрее, чем MD-5 для вычисления (второе требование). Иногда как важный, CRC-32 только требует, чтобы 32 бита сохранили значение, которое будет сравнено. MD-5 требует 4 раза устройства хранения данных, и SHA-1 требует 5 раз устройства хранения данных.
BTW, любая техника будет усилена путем предварительного ожидания длины файла при вычислении хеша.
Кажется, это ограничение NHibernate, из Документация NHibernate :
Процедура должна вернуть набор результатов. NHibernate будет использовать IDbCommand.ExecuteReader () для получения результатов.
NHibernate позволяет вам заниматься объектно-ориентированным программированием и заботится об извлечении объектов и сохранении объектов в базе данных за кулисами.
NHibernate не предоставляет вам простой API для простого выполнения хранимых процедур, потому что это, похоже, не имеет ничего общего с объектно-ориентированным программированием, будь то выборка объектов или их сохранение.
Итак, вы делаете что-то в корне неверное, пытаясь использовать NHibernate напрямую для выполнения процедурных процедур. код. Если вы хотите использовать NHibernate, вы должны сказать ему, как выполнение этой хранимой процедуры за кулисами волшебным образом поможет в извлечении объектов из базы данных и сохранении объектов в ней.
Вы можете:
IDbConnection
или получение ISession
' s соединение, создание IDbCommand
и т. д. Сделайте это, если вам нужен одноразовый подход к выполнению хранимых процедур.
, для выполнения этой хранимой процедуры, когда некоторые другие события отправляются через конвейер NHibernate. Делайте это только в том случае, если эта хранимая процедура действительно должна выполняться каждый раз и только при возникновении этих событий. ExecuteUpdate on SQL Query должен вам помочь.
Пример:
ISession session = ....
IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.ExecuteUpdate();