Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 md5 без udf  [new]
Шавлюк Евгений
Member

Откуда: Одесса
Сообщений: 360
С появлением в fb3 хранимых функций, я смог (почти) отказаться от udf (rfunc)
Оставалась только одна функция md5

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

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

+ md5 на sql
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
1 мар 15, 20:37    [17329111]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
Эх.... Вот если бы UDR на Java можно было писать...
В теории FB3 такое позволяет, только вот плагин до сих пор никем не написан.
2 мар 15, 09:42    [17330131]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Коваленко Дмитрий
Member

Откуда: Липецк
Сообщений: 485
Шавлюк Евгений,

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

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

+ проверка sql_md5 на c#
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

На выходе получаем что-то вроде:
+
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).
2 мар 15, 11:23    [17330635]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Коваленко Дмитрий
Member

Откуда: Липецк
Сообщений: 485
Коваленко Дмитрий
Но в целом, на мелких файлах (<256KB), вроде все сходится :)


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

Впрочем, это уже не важно :)
2 мар 15, 11:29    [17330663]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
stelvic
Member

Откуда:
Сообщений: 261
Симонов Денис,

а если бы еще на питоне
2 мар 15, 15:38    [17332356]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28466

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

2 мар 15, 16:32    [17332828]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
stelvic,

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

Смысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.
2 мар 15, 16:50    [17333001]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28466

Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 16:52:27:

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

Posted via ActualForum NNTP Server 1.5

2 мар 15, 16:52    [17333012]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
Мимопроходящий,

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

Ты смотрел как сейчас программируются новые UDR в FB3? Там адский ад. Хотелось бы чтобы это было попроще, что-то вроде Java UDR в Red Database
2 мар 15, 17:03    [17333105]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28466

Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 17:07:04:

Симонов Денис
> в каком смысле?
по жизни.
отвечать не обязательно - вопрос был риторическим.
ты не обижайся, но твой пассаж про "безопасные языки"
звучит на уровне банальной эрудициитм

Posted via ActualForum NNTP Server 1.5

2 мар 15, 17:08    [17333131]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Коваленко Дмитрий
Member

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

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

Пойду я лучше .... чаю попью.
2 мар 15, 17:23    [17333260]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 7514
Симонов Денис
Смысл этой хотелки очень простой. Ошибка в UDR/UDF на С++ может привести к утечки памяти или вообще падению сервера. Java/C# более безопасные в этом смысле языки потому как не общаются с указателями напрямую.
J(ava)V(irtual)M(achine) это такая dll с обвязкой из rt.jar и некоторых других вещей.
Внутри этой JVM, да - всё достаточно безопасно. Но и там можно организовать утечку ресурсов. Иногда - без особых усилий.
А так - J(ava)N(ative)I(nterface) в руки и вперёд, на мины.
2 мар 15, 17:26    [17333281]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
Basil A. Sidorov,

а я и не сказал что оно безопасно в принципе. Там была фраза "более безопасные", т.е накосячить можно в любом случае. Просто вероятность этих косяков несколько ниже.
2 мар 15, 17:45    [17333441]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28466

Hello, Симонов Денис!
You wrote on 2 марта 2015 г. 18:02:59:

Симонов Денис
> вероятность этих косяков несколько ниже.

у тебя есть численные значения этих вероятностей?
чисто для сравнения.

Posted via ActualForum NNTP Server 1.5

2 мар 15, 18:02    [17333578]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
откуда ж я их возьму? Тут ведь не только в безопасности дело. Вот официальный пример UDR Firebird

+ UDR на C++
/***
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

package MyUDR;

public class MyUDRClass {

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

}
2 мар 15, 18:27    [17333708]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
stelvic
Member

Откуда:
Сообщений: 261
Симонов Денис
stelvic,

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

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


Как бы не тролил. Это к Мимопроходящему. Помечтал слегка. Вообще Питон в плане безопасности такой же как и Джава. Ну а в плане лаконичности синтаксиса пожалуй уделывает ее.
3 мар 15, 22:05    [17339833]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 7827
Симонов Денис
Вот так бы эта UDR выглядела на Java
сишный код складывает заведомо любое кол-во слагаемых, а жававский строго 3 штуки. Как бы не совсем эквивалент.
4 мар 15, 09:59    [17340901]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
эквивалентный пример есть тут, если это кому-то интересно. Адриано всё таки ведёт разработку в этом направлении. Правда этот документ на португальском
4 мар 15, 10:50    [17341140]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: md5 без udf  [new]
Atanas
Member

Откуда:
Сообщений: 22
Шавлюк Евгений,

Спасибо, за проделанный труд! Перегнал под FB2.5
18 янв 17, 11:38    [20117619]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Шавлюк Евгений
Member

Откуда: Одесса
Сообщений: 360
Atanas,

Рад, что пригодилось
18 янв 17, 13:10    [20118138]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7427
Шавлюк Евгений,

в 4.0 HASH переделали так чтобы можно было использовать MD5 и другие распространённые алгоритмы хэширования
11 сен 17, 14:37    [20786945]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
my_friend
Guest
Atanas
Шавлюк Евгений,

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


Поделись с сообществом
27 сен 17, 17:08    [20827372]     Ответить | Цитировать Сообщить модератору
 Re: md5 без udf  [new]
Vladimir779
Member

Откуда:
Сообщений: 63
my_friend
Atanas
Шавлюк Евгений,

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


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


Реально, поделись пожалуйста под FB2.5
30 сен 17, 11:11    [20833153]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить