powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / md5 без udf
25 сообщений из 25, страница 1 из 1
md5 без udf
    #38891888
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С появлением в fb3 хранимых функций, я смог (почти) отказаться от udf (rfunc)
Оставалась только одна функция md5

Вчера заморочился, и сделал на sql, без использования каких-либо udf.
Юникод работает, результаты с md5sum из rfunc совпадают.

Из минусов - работает намного медленнее.

md5 на sql
Код: sql
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
create or alter function MD5 (
    SOURCE blob character set OCTETS)
returns char(32) character set OCTETS
AS
declare variable A bigint = 0x0067452301;
declare variable B bigint = 0x00efcdab89;
declare variable C bigint = 0x0098badcfe;
declare variable D bigint = 0x0010325476;
declare variable AA bigint;
declare variable BB bigint;
declare variable CC bigint;
declare variable DD bigint;
declare variable buf char(64) character set octets;
declare variable len bigint;
declare variable m int;
declare variable n int;

declare function F (a bigint, b bigint, c bigint, d bigint, k int, s int, T bigint, p int, V char(64) character set octets) returns bigint
as
declare variable ff bigint;
declare variable r bigint;
declare variable x bigint;
begin
  X = bin_or(ascii_val(substring(V from k*4 + 1 for 1)),
             bin_shl(ascii_val(substring(V from k*4 + 2 for 1)), 8),
             bin_shl(ascii_val(substring(V from k*4 + 3 for 1)),16),
             bin_shl(ascii_val(substring(V from k*4 + 4 for 1)),24));

  if (p = 1) then /* f */
    ff = bin_or(bin_and(b, c), bin_and(bin_not(b), d));
  if (p = 2) then /* g */
    ff = bin_or(bin_and(b, d), bin_and(bin_not(d), c));
  if (p = 3) then /* h */
    ff = bin_xor(b, c, d);
  if (p = 4) then /* i */
    ff = bin_xor(c, bin_or(bin_not(d), b));

  r = bin_and(0x00FFFFFFFF, a + ff + x + t);
  r = bin_and(0x00FFFFFFFF, b + bin_or(bin_shl(r, s), bin_shr(r, 32 - s)));
  return r;
end

declare function IntToChar4(V bigint) returns char(4) character set octets
as
begin
  return ascii_char(bin_and(0xFF, V))||
         ascii_char(bin_and(0xFF, bin_shr(V, 8)))||
         ascii_char(bin_and(0xFF, bin_shr(V, 16)))||
         ascii_char(bin_and(0xFF, bin_shr(V, 24)));
end

declare function IntToHex(V bigint) returns char(8) character set octets
as
declare variable h char(16) = '0123456789ABCDEF';
begin
  return substring(h from bin_and(0x0F, bin_shr(V, 4))+1 for 1) ||
         substring(h from bin_and(0x0F, V)+1  for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 12))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 8))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 20))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 16))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 28))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 24))+1 for 1);
end

begin
  len = octet_length(source);
  m = 56 - mod(len + 1, 64);
  if (m < 0) then m = m + 64;
  source = source || rpad(x'80', m+1, x'00') || IntToChar4(bin_and(0x00FFFFFFFF, bin_shl(len, 3))) || IntToChar4(bin_shr(len, 32-3));

  n = 0;
  while (n < (len+m+9) / 64) do
  begin
    AA = A;
    BB = B;
    CC = C;
    DD = D;

    buf = substring(source from n * 64 + 1 for 64);

    /* Round 1 */
    A = F(A, B, C, D,  0,  7, 0x00d76aa478, 1, buf); /* 1 */
    D = F(D, A, B, C,  1, 12, 0x00e8c7b756, 1, buf); /* 2 */
    C = F(C, D, A, B,  2, 17, 0x00242070db, 1, buf); /* 3 */
    B = F(B, C, D, A,  3, 22, 0x00c1bdceee, 1, buf); /* 4 */
    A = F(A, B, C, D,  4,  7, 0x00f57c0faf, 1, buf); /* 5 */
    D = F(D, A, B, C,  5, 12, 0x004787c62a, 1, buf); /* 6 */
    C = F(C, D, A, B,  6, 17, 0x00a8304613, 1, buf); /* 7 */
    B = F(B, C, D, A,  7, 22, 0x00fd469501, 1, buf); /* 8 */
    A = F(A, B, C, D,  8,  7, 0x00698098d8, 1, buf); /* 9 */
    D = F(D, A, B, C,  9, 12, 0x008b44f7af, 1, buf); /* 10 */
    C = F(C, D, A, B, 10, 17, 0x00ffff5bb1, 1, buf); /* 11 */
    B = F(B, C, D, A, 11, 22, 0x00895cd7be, 1, buf); /* 12 */
    A = F(A, B, C, D, 12,  7, 0x006b901122, 1, buf); /* 13 */
    D = F(D, A, B, C, 13, 12, 0x00fd987193, 1, buf); /* 14 */
    C = F(C, D, A, B, 14, 17, 0x00a679438e, 1, buf); /* 15 */
    B = F(B, C, D, A, 15, 22, 0x0049b40821, 1, buf); /* 16 */

    /* Round 2 */
    A = F(A, B, C, D,  1,  5, 0x00f61e2562, 2, buf); /* 17 */
    D = F(D, A, B, C,  6,  9, 0x00c040b340, 2, buf); /* 18 */
    C = F(C, D, A, B, 11, 14, 0x00265e5a51, 2, buf); /* 19 */
    B = F(B, C, D, A,  0, 20, 0x00e9b6c7aa, 2, buf); /* 20 */
    A = F(A, B, C, D,  5,  5, 0x00d62f105d, 2, buf); /* 21 */
    D = F(D, A, B, C, 10,  9, 0x0002441453, 2, buf); /* 22 */
    C = F(C, D, A, B, 15, 14, 0x00d8a1e681, 2, buf); /* 23 */
    B = F(B, C, D, A,  4, 20, 0x00e7d3fbc8, 2, buf); /* 24 */
    A = F(A, B, C, D,  9,  5, 0x0021e1cde6, 2, buf); /* 25 */
    D = F(D, A, B, C, 14,  9, 0x00c33707d6, 2, buf); /* 26 */
    C = F(C, D, A, B,  3, 14, 0x00f4d50d87, 2, buf); /* 27 */
    B = F(B, C, D, A,  8, 20, 0x00455a14ed, 2, buf); /* 28 */
    A = F(A, B, C, D, 13,  5, 0x00a9e3e905, 2, buf); /* 29 */
    D = F(D, A, B, C,  2,  9, 0x00fcefa3f8, 2, buf); /* 30 */
    C = F(C, D, A, B,  7, 14, 0x00676f02d9, 2, buf); /* 31 */
    B = F(B, C, D, A, 12, 20, 0x008d2a4c8a, 2, buf); /* 32 */

    /* Round 3 */
    A = F(A, B, C, D,  5,  4, 0x00fffa3942, 3, buf); /* 33 */
    D = F(D, A, B, C,  8, 11, 0x008771f681, 3, buf); /* 34 */
    C = F(C, D, A, B, 11, 16, 0x006d9d6122, 3, buf); /* 35 */
    B = F(B, C, D, A, 14, 23, 0x00fde5380c, 3, buf); /* 36 */
    A = F(A, B, C, D,  1,  4, 0x00a4beea44, 3, buf); /* 37 */
    D = F(D, A, B, C,  4, 11, 0x004bdecfa9, 3, buf); /* 38 */
    C = F(C, D, A, B,  7, 16, 0x00f6bb4b60, 3, buf); /* 39 */
    B = F(B, C, D, A, 10, 23, 0x00bebfbc70, 3, buf); /* 40 */
    A = F(A, B, C, D, 13,  4, 0x00289b7ec6, 3, buf); /* 41 */
    D = F(D, A, B, C,  0, 11, 0x00eaa127fa, 3, buf); /* 42 */
    C = F(C, D, A, B,  3, 16, 0x00d4ef3085, 3, buf); /* 43 */
    B = F(B, C, D, A,  6, 23, 0x0004881d05, 3, buf); /* 44 */
    A = F(A, B, C, D,  9,  4, 0x00d9d4d039, 3, buf); /* 45 */
    D = F(D, A, B, C, 12, 11, 0x00e6db99e5, 3, buf); /* 46 */
    C = F(C, D, A, B, 15, 16, 0x001fa27cf8, 3, buf); /* 47 */
    B = F(B, C, D, A,  2, 23, 0x00c4ac5665, 3, buf); /* 48 */

    /* Round 4 */
    A = F(A, B, C, D,  0,  6, 0x00f4292244, 4, buf); /* 49 */
    D = F(D, A, B, C,  7, 10, 0x00432aff97, 4, buf); /* 50 */
    C = F(C, D, A, B, 14, 15, 0x00ab9423a7, 4, buf); /* 51 */
    B = F(B, C, D, A,  5, 21, 0x00fc93a039, 4, buf); /* 52 */
    A = F(A, B, C, D, 12,  6, 0x00655b59c3, 4, buf); /* 53 */
    D = F(D, A, B, C,  3, 10, 0x008f0ccc92, 4, buf); /* 54 */
    C = F(C, D, A, B, 10, 15, 0x00ffeff47d, 4, buf); /* 55 */
    B = F(B, C, D, A,  1, 21, 0x0085845dd1, 4, buf); /* 56 */
    A = F(A, B, C, D,  8,  6, 0x006fa87e4f, 4, buf); /* 57 */
    D = F(D, A, B, C, 15, 10, 0x00fe2ce6e0, 4, buf); /* 58 */
    C = F(C, D, A, B,  6, 15, 0x00a3014314, 4, buf); /* 59 */
    B = F(B, C, D, A, 13, 21, 0x004e0811a1, 4, buf); /* 60 */
    A = F(A, B, C, D,  4,  6, 0x00f7537e82, 4, buf); /* 61 */
    D = F(D, A, B, C, 11, 10, 0x00bd3af235, 4, buf); /* 62 */
    C = F(C, D, A, B,  2, 15, 0x002ad7d2bb, 4, buf); /* 63 */
    B = F(B, C, D, A,  9, 21, 0x00eb86d391, 4, buf); /* 64 */

    A = bin_and(0x00FFFFFFFF, AA + A);
    B = bin_and(0x00FFFFFFFF, BB + B);
    C = bin_and(0x00FFFFFFFF, CC + C);
    D = bin_and(0x00FFFFFFFF, DD + D);
    n = n + 1;
  end

  return IntToHex(a)||IntToHex(b)||IntToHex(c)||IntToHex(d);
end

...
Рейтинг: 0 / 0
md5 без udf
    #38892059
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх.... Вот если бы UDR на Java можно было писать...
В теории FB3 такое позволяет, только вот плагин до сих пор никем не написан.
...
Рейтинг: 0 / 0
md5 без udf
    #38892142
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

"Намного медленнее", это наверное не совсем точная оценка...

Но в целом, на мелких файлах (<256KB), вроде все сходится :)

проверка sql_md5 на c#
Код: c#
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
using System;

using xdb=lcpi.data.oledb;
using structure_lib=lcpi.lib.structure;

using sys_md5=System.Security.Cryptography.MD5;

namespace ConsoleApplication1{
////////////////////////////////////////////////////////////////////////////////
//class Program

class Program
{
 static uint sm_n=0;
 static uint sm_n_fail=0;

 const string c_cn_str
  ="provider=LCPI.IBProvider.3;"
  +"location=w7_64-sql2012:c:\\works\\database\\ibp_test_fb30_d3.gdb;"
  +"user id=SYSDBA;"
  +"password=masterkey;"
  +"dbclient_library=fbclient_30.dll";

 const string c_root_dir="d:\\distrib";

 static void Main(string[] args)
 {
  xdb.OleDbConnection  cn=null;
  xdb.OleDbTransaction tr=null;
  xdb.OleDbCommand     cmd=null;

  sys_md5 md5=null;

  try
  {
   cn=new xdb.OleDbConnection(c_cn_str);

   cn.Open();

   tr=cn.BeginTransaction();

   cmd=new xdb.OleDbCommand("select MD5(:file) from RDB$DATABASE;",cn,tr);

   md5=sys_md5.Create();

   ScanDir(c_root_dir,md5,cmd);

   tr.Commit();
  }
  catch(Exception exc)
  {
   Console.WriteLine("ERROR: {0} - {1}",exc.Source,exc.Message);
  }//catch
  finally
  {
   structure_lib.dispose_utils.exec(ref cmd);
   structure_lib.dispose_utils.exec(ref tr);
   structure_lib.dispose_utils.exec(ref cn);
   structure_lib.dispose_utils.exec(ref md5);
  }//finally

  Console.WriteLine("TOTAL: {0}",sm_n);
  Console.WriteLine("FAIL : {0}",sm_n_fail);
 }//Main

 static void ScanDir(string path,sys_md5 md5,xdb.OleDbCommand cmd)
 {
  Console.WriteLine("DIR: {0}",path);

  var dir_info=new System.IO.DirectoryInfo(path);

  foreach(var d in dir_info.GetDirectories())
  {
   ScanDir(d.FullName,md5,cmd);
  }

  foreach(var f in dir_info.GetFiles())
  {
   if(f.Length<256*1024)
    TestMD5(f.FullName,md5,cmd);
  }
 }//ScanDir

 static void TestMD5(string path,sys_md5 md5,xdb.OleDbCommand cmd)
 {
  ++sm_n;

  Console.WriteLine("FILE: {0}",path);

  var s=new System.IO.FileStream(path,System.IO.FileMode.Open,System.IO.FileAccess.Read);

  var md5_1=md5.ComputeHash(s);

  s.Seek(0,System.IO.SeekOrigin.Begin);

  cmd["file"].Value=s;

  var md5_2=cmd.ExecuteScalar();

  if(md5_1.Equals(md5_2))
  {
   ++sm_n_fail;

   Console.WriteLine("FAIL");
  }
  else
  {
   Console.WriteLine("OK");
  }
 }//TestMD5
}//class Program

///////////////////////////////////////////////////////////////////////////////
}//namespace ConsoleApplication1


На выходе получаем что-то вроде:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
FILE: d:\distrib\Microsoft__redistr\vs2008_SP1_09_0_30729_04148\Release\amd64\Microsoft.VC90.MFCLOC\MFC90CHS.dll
OK
FILE: d:\distrib\Microsoft__redistr\vs2008_SP1_09_0_30729_04148\Release\amd64\Microsoft.VC90.MFCLOC\MFC90CHT.dll
OK
FILE: d:\distrib\Microsoft__redistr\vs2008_SP1_09_0_30729_04148\Release\amd64\Microsoft.VC90.MFCLOC\MFC90DEU.dll
ERROR: Multiple Sources - 1. [LCPI.IBProvider.3] Ошибка выборки данных результирующего множества.
Error reading data from the connection.

Код ошибки COM: E_FAIL. SQL State: "08006". Код ошибки DBMS: 335544726.
--------------------------------
2. [lcpi.data.oledb.OleDbDataReader] Выборка рядов из набора строк OLEDB завершилась с ошибками.

Код ошибки COM: E_FAIL.
TOTAL: 313
FAIL : 0


Это был не совсем свежий FB3 - 31643 (14 февраля 2015).
...
Рейтинг: 0 / 0
md5 без udf
    #38892148
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко ДмитрийНо в целом, на мелких файлах (<256KB), вроде все сходится :)


Хотя не, похоже что все наоборот. Надо же было "if(!md5_1.Equals(md5_2))" написать.

Впрочем, это уже не важно :)
...
Рейтинг: 0 / 0
md5 без udf
    #38892508
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

а если бы еще на питоне
...
Рейтинг: 0 / 0
md5 без udf
    #38892603
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Stelvic!
You wrote on 2 марта 2015 г. 16:31:03:

Stelvic> а если бы еще на питоне
не, давайте лучше pl/sql прикрутим, вместе с T-SQL.
а также ADA, COBOL и Visual BASIC.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
md5 без udf
    #38892632
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic,

не надо тролить. UDR на питоне никто не обещал (оставим это postgresql). Хотя в новой архитектуре это и возможно. А вот про Java разговор был.

Смысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.
...
Рейтинг: 0 / 0
md5 без udf
    #38892634
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 16:52:27:

Симонов Денис> Смысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести
> к утечки памяти или вообще падению сервера. Java/C# более безопасные в
> этом смысле языки потому как не общаются с указателями напрямую.
Денис, ты программист?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
md5 без udf
    #38892644
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

в каком смысле? Могу ли я написать UDF. Да могу. И писал не одну. И на ошибки там налетал, потом исправлял их.

Ты смотрел как сейчас программируются новые UDR в FB3? Там адский ад. Хотелось бы чтобы это было попроще, что-то вроде Java UDR в Red Database
...
Рейтинг: 0 / 0
md5 без udf
    #38892646
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 17:07:04:

Симонов Денис> в каком смысле? по жизни.
отвечать не обязательно - вопрос был риторическим.
ты не обижайся, но твой пассаж про "безопасные языки"
звучит на уровне банальной эрудиции тм
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
md5 без udf
    #38892666
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисне надо тролить. UDR на питоне никто не обещал (оставим это postgresql). Хотя в новой архитектуре это и возможно. А вот про Java разговор был.
тынц
Симонов ДенисСмысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.
Пойду я лучше .... чаю попью.
...
Рейтинг: 0 / 0
md5 без udf
    #38892670
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСмысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.J(ava)V(irtual)M(achine) это такая dll с обвязкой из rt.jar и некоторых других вещей.
Внутри этой JVM, да - всё достаточно безопасно. Но и там можно организовать утечку ресурсов. Иногда - без особых усилий.
А так - J(ava)N(ative)I(nterface) в руки и вперёд, на мины.
...
Рейтинг: 0 / 0
md5 без udf
    #38892691
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

а я и не сказал что оно безопасно в принципе. Там была фраза "более безопасные", т.е накосячить можно в любом случае. Просто вероятность этих косяков несколько ниже.
...
Рейтинг: 0 / 0
md5 без udf
    #38892714
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 18:02:59:

Симонов Денис> вероятность этих косяков несколько ниже.
у тебя есть численные значения этих вероятностей?
чисто для сравнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
md5 без udf
    #38892736
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откуда ж я их возьму? Тут ведь не только в безопасности дело. Вот официальный пример UDR Firebird

UDR на C++
Код: plaintext
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
/***
create function sum_args (
    n1 integer,
    n2 integer,
    n3 integer
) returns integer
    external name 'udrcpp_example!sum_args'
    engine udr;
***/
FB_UDR_BEGIN_FUNCTION(sum_args)
	// Without InMessage/OutMessage definitions, messages will be byte-based.

	FB_UDR_CONSTRUCTOR
		// , inCount(0)
	{
		// Get input metadata.
		AutoRelease<IMessageMetadata> inMetadata(metadata->getInputMetadata(status));

		// Get count of input parameters.
		inCount = inMetadata->getCount(status);

		inNullOffsets.reset(new unsigned[inCount]);
		inOffsets.reset(new unsigned[inCount]);

		for (unsigned i = 0; i < inCount; ++i)
		{
			// Get null offset of the i-th input parameter.
			inNullOffsets[i] = inMetadata->getNullOffset(status, i);

			// Get the offset of the i-th input parameter.
			inOffsets[i] = inMetadata->getOffset(status, i);
		}

		// Get output metadata.
		AutoRelease<IMessageMetadata> outMetadata(metadata->getOutputMetadata(status));

		// Get null offset of the return value.
		outNullOffset = outMetadata->getNullOffset(status, 0);

		// Get offset of the return value.
		outOffset = outMetadata->getOffset(status, 0);
	}

	// This function requires the INTEGER parameters and return value, otherwise it will crash.
	// Metadata is inspected dynamically (in execute). This is not the fastest method.
	FB_UDR_EXECUTE_FUNCTION
	{
		*(ISC_SHORT*) (out + outNullOffset) = FB_FALSE;

		// Get a reference to the return value.
		ISC_LONG& ret = *(ISC_LONG*) (out + outOffset);

		// The return value is automatically initialized to 0.
		///ret = 0;

		for (unsigned i = 0; i < inCount; ++i)
		{
			// If the i-th input parameter is NULL, set the output to NULL and finish.
			if (*(ISC_SHORT*) (in + inNullOffsets[i]))
			{
				*(ISC_SHORT*) (out + outNullOffset) = FB_TRUE;
				return;
			}

			// Read the i-th input parameter value and sum it in the referenced return value.
			ret += *(ISC_LONG*) (in + inOffsets[i]);
		}
	}

	unsigned inCount;
	AutoArrayDelete<unsigned> inNullOffsets;
	AutoArrayDelete<unsigned> inOffsets;
	unsigned outNullOffset;
	unsigned outOffset;
FB_UDR_END_FUNCTION



А что же делает эта UDR? Да всего-то складывает n1+n2+n3.

Вот так бы эта UDR выглядела на Java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
package MyUDR;

public class MyUDRClass {

  public static int sum_args(int n1, int n2, int n3)  {
    return n1 + n2 + n3;
  }

}
...
Рейтинг: 0 / 0
md5 без udf
    #38894101
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисstelvic,

не надо тролить. UDR на питоне никто не обещал (оставим это postgresql). Хотя в новой архитектуре это и возможно. А вот про Java разговор был.

Смысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.

Как бы не тролил. Это к Мимопроходящему. Помечтал слегка. Вообще Питон в плане безопасности такой же как и Джава. Ну а в плане лаконичности синтаксиса пожалуй уделывает ее.
...
Рейтинг: 0 / 0
md5 без udf
    #38894279
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВот так бы эта UDR выглядела на Javaсишный код складывает заведомо любое кол-во слагаемых, а жававский строго 3 штуки. Как бы не совсем эквивалент.
...
Рейтинг: 0 / 0
md5 без udf
    #38894351
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эквивалентный пример есть тут , если это кому-то интересно. Адриано всё таки ведёт разработку в этом направлении. Правда этот документ на португальском
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
md5 без udf
    #39386694
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

Спасибо, за проделанный труд! Перегнал под FB2.5
...
Рейтинг: 0 / 0
md5 без udf
    #39386794
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atanas,

Рад, что пригодилось
...
Рейтинг: 0 / 0
md5 без udf
    #39519216
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

в 4.0 HASH переделали так чтобы можно было использовать MD5 и другие распространённые алгоритмы хэширования
...
Рейтинг: 0 / 0
md5 без udf
    #39527230
my_friend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AtanasШавлюк Евгений,

Перегнал под FB2.5

Поделись с сообществом
...
Рейтинг: 0 / 0
md5 без udf
    #39528770
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_friendAtanasШавлюк Евгений,

Перегнал под FB2.5

Поделись с сообществом

Реально, поделись пожалуйста под FB2.5
...
Рейтинг: 0 / 0
md5 без udf
    #39693843
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir779,

Код: sql
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
/******************************************************************************/
/***          Generated by IBExpert 2018.6.8.1 27.08.2018 16:31:02          ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

CREATE OR ALTER PROCEDURE MD5 (
    SOURCE BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET OCTETS)
RETURNS (
    RES CHAR(32) CHARACTER SET OCTETS)
AS
BEGIN
  SUSPEND;
END^





CREATE OR ALTER PROCEDURE MD5_F (
    A BIGINT,
    B BIGINT,
    C BIGINT,
    D BIGINT,
    K INTEGER,
    S INTEGER,
    T BIGINT,
    P INTEGER,
    V CHAR(64) CHARACTER SET OCTETS)
RETURNS (
    RES BIGINT)
AS
BEGIN
  SUSPEND;
END^





CREATE OR ALTER PROCEDURE MD5_INTTOCHAR4 (
    V BIGINT)
RETURNS (
    RES CHAR(4) CHARACTER SET OCTETS)
AS
BEGIN
  SUSPEND;
END^





CREATE OR ALTER PROCEDURE MD5_INTTOHEX (
    V BIGINT)
RETURNS (
    RES CHAR(8) CHARACTER SET OCTETS)
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

CREATE OR ALTER PROCEDURE MD5 (
    SOURCE BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET OCTETS)
RETURNS (
    RES CHAR(32) CHARACTER SET OCTETS)
AS
declare variable A bigint = 0X0067452301;
declare variable B bigint = 0X00EFCDAB89;
declare variable C bigint = 0X0098BADCFE;
declare variable D bigint = 0X0010325476;
declare variable AA bigint;
declare variable BB bigint;
declare variable CC bigint;
declare variable DD bigint;
declare variable BUF char(64) character set OCTETS;
declare variable LEN bigint;
declare variable M integer;
declare variable N integer;
begin
  len = octet_length(source);
  m = 56 - mod(len + 1, 64);
  if (m < 0) then m = m + 64;
  source = source || rpad(x'80', m+1, x'00') ||
    (select res from md5_IntToChar4(bin_and(0x00FFFFFFFF, bin_shl(:len, 3)))) ||
    (select res from md5_IntToChar4(bin_shr(:len, 32-3)));

  n = 0;
  while (n < (len+m+9) / 64) do
  begin
    AA = A;
    BB = B;
    CC = C;
    DD = D;

    buf = substring(source from n * 64 + 1 for 64);

    /* Round 1 */
    A = (select res from md5_F(:A, :B, :C, :D,  0,  7, 0x00d76aa478, 1, :buf)); /* 1 */
    D = (select res from md5_F(:D, :A, :B, :C,  1, 12, 0x00e8c7b756, 1, :buf)); /* 2 */
    C = (select res from md5_F(:C, :D, :A, :B,  2, 17, 0x00242070db, 1, :buf)); /* 3 */
    B = (select res from md5_F(:B, :C, :D, :A,  3, 22, 0x00c1bdceee, 1, :buf)); /* 4 */
    A = (select res from md5_F(:A, :B, :C, :D,  4,  7, 0x00f57c0faf, 1, :buf)); /* 5 */
    D = (select res from md5_F(:D, :A, :B, :C,  5, 12, 0x004787c62a, 1, :buf)); /* 6 */
    C = (select res from md5_F(:C, :D, :A, :B,  6, 17, 0x00a8304613, 1, :buf)); /* 7 */
    B = (select res from md5_F(:B, :C, :D, :A,  7, 22, 0x00fd469501, 1, :buf)); /* 8 */
    A = (select res from md5_F(:A, :B, :C, :D,  8,  7, 0x00698098d8, 1, :buf)); /* 9 */
    D = (select res from md5_F(:D, :A, :B, :C,  9, 12, 0x008b44f7af, 1, :buf)); /* 10 */
    C = (select res from md5_F(:C, :D, :A, :B, 10, 17, 0x00ffff5bb1, 1, :buf)); /* 11 */
    B = (select res from md5_F(:B, :C, :D, :A, 11, 22, 0x00895cd7be, 1, :buf)); /* 12 */
    A = (select res from md5_F(:A, :B, :C, :D, 12,  7, 0x006b901122, 1, :buf)); /* 13 */
    D = (select res from md5_F(:D, :A, :B, :C, 13, 12, 0x00fd987193, 1, :buf)); /* 14 */
    C = (select res from md5_F(:C, :D, :A, :B, 14, 17, 0x00a679438e, 1, :buf)); /* 15 */
    B = (select res from md5_F(:B, :C, :D, :A, 15, 22, 0x0049b40821, 1, :buf)); /* 16 */

    /* Round 2 */
    A = (select res from md5_F(:A, :B, :C, :D,  1,  5, 0x00f61e2562, 2, :buf)); /* 17 */
    D = (select res from md5_F(:D, :A, :B, :C,  6,  9, 0x00c040b340, 2, :buf)); /* 18 */
    C = (select res from md5_F(:C, :D, :A, :B, 11, 14, 0x00265e5a51, 2, :buf)); /* 19 */
    B = (select res from md5_F(:B, :C, :D, :A,  0, 20, 0x00e9b6c7aa, 2, :buf)); /* 20 */
    A = (select res from md5_F(:A, :B, :C, :D,  5,  5, 0x00d62f105d, 2, :buf)); /* 21 */
    D = (select res from md5_F(:D, :A, :B, :C, 10,  9, 0x0002441453, 2, :buf)); /* 22 */
    C = (select res from md5_F(:C, :D, :A, :B, 15, 14, 0x00d8a1e681, 2, :buf)); /* 23 */
    B = (select res from md5_F(:B, :C, :D, :A,  4, 20, 0x00e7d3fbc8, 2, :buf)); /* 24 */
    A = (select res from md5_F(:A, :B, :C, :D,  9,  5, 0x0021e1cde6, 2, :buf)); /* 25 */
    D = (select res from md5_F(:D, :A, :B, :C, 14,  9, 0x00c33707d6, 2, :buf)); /* 26 */
    C = (select res from md5_F(:C, :D, :A, :B,  3, 14, 0x00f4d50d87, 2, :buf)); /* 27 */
    B = (select res from md5_F(:B, :C, :D, :A,  8, 20, 0x00455a14ed, 2, :buf)); /* 28 */
    A = (select res from md5_F(:A, :B, :C, :D, 13,  5, 0x00a9e3e905, 2, :buf)); /* 29 */
    D = (select res from md5_F(:D, :A, :B, :C,  2,  9, 0x00fcefa3f8, 2, :buf)); /* 30 */
    C = (select res from md5_F(:C, :D, :A, :B,  7, 14, 0x00676f02d9, 2, :buf)); /* 31 */
    B = (select res from md5_F(:B, :C, :D, :A, 12, 20, 0x008d2a4c8a, 2, :buf)); /* 32 */

    /* Round 3 */
    A = (select res from md5_F(:A, :B, :C, :D,  5,  4, 0x00fffa3942, 3, :buf)); /* 33 */
    D = (select res from md5_F(:D, :A, :B, :C,  8, 11, 0x008771f681, 3, :buf)); /* 34 */
    C = (select res from md5_F(:C, :D, :A, :B, 11, 16, 0x006d9d6122, 3, :buf)); /* 35 */
    B = (select res from md5_F(:B, :C, :D, :A, 14, 23, 0x00fde5380c, 3, :buf)); /* 36 */
    A = (select res from md5_F(:A, :B, :C, :D,  1,  4, 0x00a4beea44, 3, :buf)); /* 37 */
    D = (select res from md5_F(:D, :A, :B, :C,  4, 11, 0x004bdecfa9, 3, :buf)); /* 38 */
    C = (select res from md5_F(:C, :D, :A, :B,  7, 16, 0x00f6bb4b60, 3, :buf)); /* 39 */
    B = (select res from md5_F(:B, :C, :D, :A, 10, 23, 0x00bebfbc70, 3, :buf)); /* 40 */
    A = (select res from md5_F(:A, :B, :C, :D, 13,  4, 0x00289b7ec6, 3, :buf)); /* 41 */
    D = (select res from md5_F(:D, :A, :B, :C,  0, 11, 0x00eaa127fa, 3, :buf)); /* 42 */
    C = (select res from md5_F(:C, :D, :A, :B,  3, 16, 0x00d4ef3085, 3, :buf)); /* 43 */
    B = (select res from md5_F(:B, :C, :D, :A,  6, 23, 0x0004881d05, 3, :buf)); /* 44 */
    A = (select res from md5_F(:A, :B, :C, :D,  9,  4, 0x00d9d4d039, 3, :buf)); /* 45 */
    D = (select res from md5_F(:D, :A, :B, :C, 12, 11, 0x00e6db99e5, 3, :buf)); /* 46 */
    C = (select res from md5_F(:C, :D, :A, :B, 15, 16, 0x001fa27cf8, 3, :buf)); /* 47 */
    B = (select res from md5_F(:B, :C, :D, :A,  2, 23, 0x00c4ac5665, 3, :buf)); /* 48 */

    /* Round 4 */
    A = (select res from md5_F(:A, :B, :C, :D,  0,  6, 0x00f4292244, 4, :buf)); /* 49 */
    D = (select res from md5_F(:D, :A, :B, :C,  7, 10, 0x00432aff97, 4, :buf)); /* 50 */
    C = (select res from md5_F(:C, :D, :A, :B, 14, 15, 0x00ab9423a7, 4, :buf)); /* 51 */
    B = (select res from md5_F(:B, :C, :D, :A,  5, 21, 0x00fc93a039, 4, :buf)); /* 52 */
    A = (select res from md5_F(:A, :B, :C, :D, 12,  6, 0x00655b59c3, 4, :buf)); /* 53 */
    D = (select res from md5_F(:D, :A, :B, :C,  3, 10, 0x008f0ccc92, 4, :buf)); /* 54 */
    C = (select res from md5_F(:C, :D, :A, :B, 10, 15, 0x00ffeff47d, 4, :buf)); /* 55 */
    B = (select res from md5_F(:B, :C, :D, :A,  1, 21, 0x0085845dd1, 4, :buf)); /* 56 */
    A = (select res from md5_F(:A, :B, :C, :D,  8,  6, 0x006fa87e4f, 4, :buf)); /* 57 */
    D = (select res from md5_F(:D, :A, :B, :C, 15, 10, 0x00fe2ce6e0, 4, :buf)); /* 58 */
    C = (select res from md5_F(:C, :D, :A, :B,  6, 15, 0x00a3014314, 4, :buf)); /* 59 */
    B = (select res from md5_F(:B, :C, :D, :A, 13, 21, 0x004e0811a1, 4, :buf)); /* 60 */
    A = (select res from md5_F(:A, :B, :C, :D,  4,  6, 0x00f7537e82, 4, :buf)); /* 61 */
    D = (select res from md5_F(:D, :A, :B, :C, 11, 10, 0x00bd3af235, 4, :buf)); /* 62 */
    C = (select res from md5_F(:C, :D, :A, :B,  2, 15, 0x002ad7d2bb, 4, :buf)); /* 63 */
    B = (select res from md5_F(:B, :C, :D, :A,  9, 21, 0x00eb86d391, 4, :buf)); /* 64 */

    A = bin_and(0x00FFFFFFFF, AA + A);
    B = bin_and(0x00FFFFFFFF, BB + B);
    C = bin_and(0x00FFFFFFFF, CC + C);
    D = bin_and(0x00FFFFFFFF, DD + D);
    n = n + 1;
  end

  res =
    (select res from md5_IntToHex(:a))||
    (select res from md5_IntToHex(:b))||
    (select res from md5_IntToHex(:c))||
    (select res from md5_IntToHex(:d));
    suspend;
end^


CREATE OR ALTER PROCEDURE MD5_F (
    A BIGINT,
    B BIGINT,
    C BIGINT,
    D BIGINT,
    K INTEGER,
    S INTEGER,
    T BIGINT,
    P INTEGER,
    V CHAR(64) CHARACTER SET OCTETS)
RETURNS (
    RES BIGINT)
AS
declare variable FF bigint;
declare variable R bigint;
declare variable X bigint;
begin
  X = bin_or(ascii_val(substring(V from k*4 + 1 for 1)),
             bin_shl(ascii_val(substring(V from k*4 + 2 for 1)), 8),
             bin_shl(ascii_val(substring(V from k*4 + 3 for 1)),16),
             bin_shl(ascii_val(substring(V from k*4 + 4 for 1)),24));

  if (p = 1) then /* f */
    ff = bin_or(bin_and(b, c), bin_and(bin_not(b), d));
  if (p = 2) then /* g */
    ff = bin_or(bin_and(b, d), bin_and(bin_not(d), c));
  if (p = 3) then /* h */
    ff = bin_xor(b, c, d);
  if (p = 4) then /* i */
    ff = bin_xor(c, bin_or(bin_not(d), b));

  r = bin_and(0x00FFFFFFFF, a + ff + x + t);
  r = bin_and(0x00FFFFFFFF, b + bin_or(bin_shl(r, s), bin_shr(r, 32 - s)));
  res = r;
  suspend;
end^


CREATE OR ALTER PROCEDURE MD5_INTTOCHAR4 (
    V BIGINT)
RETURNS (
    RES CHAR(4) CHARACTER SET OCTETS)
AS
begin
  res =  ascii_char(bin_and(0xFF, V))||
         ascii_char(bin_and(0xFF, bin_shr(V, 8)))||
         ascii_char(bin_and(0xFF, bin_shr(V, 16)))||
         ascii_char(bin_and(0xFF, bin_shr(V, 24)));
  suspend;
end^


CREATE OR ALTER PROCEDURE MD5_INTTOHEX (
    V BIGINT)
RETURNS (
    RES CHAR(8) CHARACTER SET OCTETS)
AS
declare variable H char(16) = '0123456789ABCDEF';
begin
  res = substring(h from bin_and(0x0F, bin_shr(V, 4))+1 for 1) ||
         substring(h from bin_and(0x0F, V)+1  for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 12))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 8))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 20))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 16))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 28))+1 for 1)||
         substring(h from bin_and(0x0F, bin_shr(V, 24))+1 for 1);
  suspend;
end^



SET TERM ; ^
...
Рейтинг: 0 / 0
md5 без udf
    #39695807
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atanas,

Спасибо!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / md5 без udf
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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