powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / где взять MD5 как в Oracle?
9 сообщений из 9, страница 1 из 1
где взять MD5 как в Oracle?
    #40081468
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На стороне клиента (на локальной машине)содержатся файлы.
Если эти файлы отличаются от тех, что содержатся в базе, то из базы подгружаются актуальные версии файлов.

Нужно как-то проверять файлы на стороне клиента. Решили вычислять MD5 локальных файлов. Нашли какие-то модули, но...
выяснилось что MD5 вычисленная локально и MD5 вычисленная ораклом иногда отличаются
если файлы маленькие (100 с небольшим килобайт), то хэши одинаковых файлов совпадают,
т.е. локально посчитанный хэш и хэш выдаваемый ораклом одинаковы

а вот если файл больше 200 килобайт, то файлы могут быть одинаковые, а хэши разные получаются

может кто подскажет где взять модуль, который будет выдавать тот же хэш, что и оракл?

зы. программы пишутся на дельфи 7, модуль под дельфи нужен
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081471
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а просто таймстампы сравнивать?
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081474
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234
MD5 вычисленная ораклом
Oracle сам по себе ничего не вычисляет. Какие типы данных используются? Каким кодом "вычисляется"?
Факты, пожалуйста, а не твоё неквалифицированное их видение.
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081476
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
а просто таймстампы сравнивать?
хотелось бы чтобы результат от файлов именно зависел

есть опасение, что время на компе может как-то не так настроено быть, т.е на время изменения файла ориентироваться не получится... или пользователь файл откроет-сохранит и он уже моложе чем на сервере получится

хранить таймстампы локально не хочется,
т.е. не хочется одновременно с файлом передавать таймстамп, где-то его на компе сохранять,
потом сравнивать локально сохраненный с тем что на сервере... всего этого не хочется
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081477
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Anton_1234
MD5 вычисленная ораклом
Oracle сам по себе ничего не вычисляет. Какие типы данных используются? Каким кодом "вычисляется"?
Факты, пожалуйста, а не твоё неквалифицированное их видение.

мд5 для блобов, типа такого

DBMS_CRYPTO.HASH ( src => i_blob, typ => DBMS_CRYPTO.HASH_MD5)
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081479
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
md5 сколько использовали, вроде проблем не было (как oracle его высчитывает, так и все распространенные языки программирования) - старый формат, уже который не рекомендуют. Да и delphi 7 стоит уже похоронить
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081680
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,

Возможно, используя функции Oracle для вычисления хэша файла, вы вычисляете хэш только для первых 4000 символов.
Всё зависит от того, как именно вы это делаете .

Вот и получается, что на маленьких файлах (до 4000 байт) хэши совпадают, а далее различаются.
...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081785
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,

P.S.
вот так решаю вопрос вычисления MD5 для BLOB- и CLOB-полей на Oracle 9.2

Код: plsql
1.
2.
3.
4.
5.
CREATE OR REPLACE PACKAGE PACK_UTILS IS
   FUNCTION GetMD5HashFromCLOB(ACLOBValue in CLOB) RETURN varchar2 DETERMINISTIC;
   FUNCTION GetMD5HashFromBLOB(ABLOBValue in BLOB) RETURN varchar2 DETERMINISTIC;   
END PACK_UTILS;
/ 


весь код
взял отсюда:
http://sql-plsql-de.blogspot.de/2008/02/md5-prfsummen-aus-blobs-oder-vlobs.html

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED PACK_JAVA_MD5 AS

   import java.security.MessageDigest;
   import java.security.NoSuchAlgorithmException;
   import java.sql.Clob;
   import java.sql.Blob;

   public class PACK_JAVA_MD5 {
     public static String getMD5HashFromClob(Clob inhalt) throws Exception{
       String sChecksum = null;
   
       if (inhalt != null) {
         try {
           String data = inhalt.getSubString(1L, (int)inhalt.length());
           MessageDigest md5 = MessageDigest.getInstance("MD5");
           md5.update(data.getBytes());
           byte result[] = md5.digest();
           StringBuffer sb = new StringBuffer();
           for (int i = 0; i < result.length; i++) {
               String s = Integer.toHexString(result[i]);
               int length = s.length();
               if (length >= 2) {
                   sb.append(s.substring(length - 2, length));
               } else {
                   sb.append("0");
                   sb.append(s);
               }
           }
           sChecksum = sb.toString();
         } catch (NoSuchAlgorithmException e) {
           // do nothing
         }
       }
       return sChecksum;
     } 
   
     public static String getMD5HashFromBlob(Blob inhalt) throws Exception{
       String sChecksum = null;
   
       if (inhalt != null) {
         try {
           MessageDigest md5 = MessageDigest.getInstance("MD5");
           md5.update(inhalt.getBytes(1L, (int)inhalt.length()));
           byte result[] = md5.digest();
           StringBuffer sb = new StringBuffer();
           for (int i = 0; i < result.length; i++) {
               String s = Integer.toHexString(result[i]);
               int length = s.length();
               if (length >= 2) {
                   sb.append(s.substring(length - 2, length));
               } else {
                   sb.append("0");
                   sb.append(s);
               }
           }
           sChecksum = sb.toString();
         } catch (NoSuchAlgorithmException e) {
           // do nothing
         }
       }
       return sChecksum;
     }
   }
/  




Код: plsql
1.
2.
3.
4.
5.
CREATE OR REPLACE PACKAGE PACK_UTILS IS
   FUNCTION GetMD5HashFromCLOB(ACLOBValue in CLOB) RETURN varchar2 DETERMINISTIC;
   FUNCTION GetMD5HashFromBLOB(ABLOBValue in BLOB) RETURN varchar2 DETERMINISTIC;   
END PACK_UTILS;
/ 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
CREATE OR REPLACE PACKAGE BODY PACK_UTILS IS
   -- //////////////////////////////////////////////////////////////
   -- [private]
   FUNCTION Java_GetMD5HashFromCLOB(inhalt CLOB) 
   RETURN varchar2
   AS LANGUAGE JAVA
   name 'PACK_JAVA_MD5.getMD5HashFromClob(java.sql.Clob) return java.lang.String';
   -- //////////////////////////////////////////////////////////////
   FUNCTION GetMD5HashFromCLOB(ACLOBValue in CLOB) 
   RETURN varchar2 DETERMINISTIC
   AS
   BEGIN
      if (ACLOBValue is NULL) or (DBMS_LOB.getlength(ACLOBValue)=0) then
         return(NULL);
      else
         return(Java_GetMD5HashFromCLOB(ACLOBValue));
      end if;
   END;
   -- //////////////////////////////////////////////////////////////
   -- [private]
   FUNCTION Java_GetMD5HashFromBLOB(inhalt BLOB) 
   RETURN varchar2 DETERMINISTIC
   AS LANGUAGE JAVA
   name 'PACK_JAVA_MD5.getMD5HashFromBlob(java.sql.Blob) return java.lang.String';
   -- //////////////////////////////////////////////////////////////
   FUNCTION GetMD5HashFromBLOB(ABLOBValue in BLOB) 
   RETURN varchar2 DETERMINISTIC
   AS
   BEGIN
      if (ABLOBValue is NULL) or (DBMS_LOB.getlength(ABLOBValue)=0) then
         return(NULL);
      else
         return(Java_GetMD5HashFromBLOB(ABLOBValue));
      end if;
   END;
   -- //////////////////////////////////////////////////////////////
END PACK_UTILS;
/



...
Рейтинг: 0 / 0
где взять MD5 как в Oracle?
    #40081852
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён,

там все хитрее оказалось... или не хитрее

копируются из базы файлы *.xls, *.xlsx
при открытии и закрытии файла Excel их меняет, хотя эти файлы не должны сохранятся, закрываются без сохранения
попробовал руками закрывать, выкидывает сообщение "сохранить файл?", жму кнопку "нет"
все равно файл оказывается изменен
несколько байт в начале файла оказываются другими (сравнивал в HEX-редакторе)

а если открытия-закрытия не делать, то MD5 совпадает с оракловским

проблемы не из-за дельфийских или оракловских алгоритмов
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / где взять MD5 как в Oracle?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]