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

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

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

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

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

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

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

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

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

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

Вот и получается, что на маленьких файлах (до 4000 байт) хэши совпадают, а далее различаются.
...
Рейтинг: 0 / 0
05.07.2021, 12:57
    #40081785
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где взять MD5 как в Oracle?
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
05.07.2021, 16:14
    #40081852
Anton_1234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где взять MD5 как в Oracle?
Кроик Семён,

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

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

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

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


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