Рассчитайте хэш/контрольную сумму в Informix SQL

StackOverflow https://stackoverflow.com/questions/1476984

  •  16-09-2019
  •  | 
  •  

Вопрос

Я хотел бы рассчитать какое -то значение хэш или контрольной суммы для значения столбца в Informix SQL.

Проблема:

Нам необходимо анонимность личной информации в тестовых данных, и хотели бы сделать это, хэшируя соответствующие значения, как в:

UPDATE personal_data SET name=HASH(name), employee_no=HASH(employee_no)

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

Большинство СУБД имеют какую -то функцию хэширования (PostgreSQL и MySQL имеют md5 (), у Oracle есть dbms_utility.get_hash_value), но я ничего не мог найти для Informix (Idformix Ids 9). Это недостающая функция?

Это было полезно?

Решение

IDS не имеет ни одной из функций хеш, выявленных как встроенные функции, AFAICR.

Предполагая, что вы используете IBM Informix Dynamic Server (IDS) версию 10.00 или более поздней версии (более ранние версии не поддерживаются-ну, 7.31 поддерживается до 2009-09-30, но не за пределами), тогда можно создать UDR (пользователь-пользователь-пользователь-пользователь определенная рутина), которая выполняет работу. Это не невероятно сложно - но это и это не тривиально.

Другие советы

СЛЕСКЕ,

Несколько лет назад я написал функцию T-SQL для вычисления хэшей SHA-1. Если это сработает для вас, возможно, вы сможете передать мою функцию для Informix. Эта ветка группы новостей имеет немного больше информации о его ограничениях.

create function S( 
  @N int, 
  @x bigint 
) returns binary(4) as begin 
  declare @two_N bigint 
  set @two_N = power(cast(2 as bigint), @N) 
  declare @two_32_N bigint 
  set @two_32_N = power(cast(2 as bigint), 32-@N) 
  return cast(@x%@two_32_N*@two_N + @x/@two_32_N as binary(4)) 
end 
go 
create function f( 
  @t bigint, 
  @B bigint, 
  @C bigint, 
  @D bigint 
) returns bigint as begin 
  declare @2_32 bigint set @2_32 = power(cast(2 as bigint),32) 
  if @t between 0 and 19 
    return (@B & @C) | ((@2_32-@B-1) & @D) 
  if @t between 20 and 39 
    return @B ^ @C ^ @D 
  if @t between 40 and 59 
    return (@B & @C) | (@B & @D) | (@C & @D) 
  return @B ^ @C ^ @D 
end 
go 
create function SHA1 ( 
  @s varchar(55) 
) returns binary(20) as begin 
  declare @b varbinary(55) 
  set @b = cast(@s as varbinary(55)) 
  declare @zeros binary(64) 
  set @zeros = 0x 
  declare @padded binary(64) 
  set @padded = 
    @b + 0x80 + substring(@zeros,1,55-datalength(@b)) 
       + cast(8*datalength(@b) as binary(8)) 
  declare @H5 binary(20) 
  set @H5 = 0x67452301EFCDAB8998BADCFE10325476C3D2E1F0 
  declare @K4 binary(16) 
  set @K4 = 0x5A8279996ED9EBA18F1BBCDCCA62C1D6 
  declare @ABCDE binary(20) set @ABCDE = @H5 
  declare @W80   varbinary(320) set @W80 = @padded 
  declare @TEMP  binary(4) set @TEMP = 0x 
  declare @2_32 bigint set @2_32 = power(cast(2 as bigint),32) 
  declare @t int 
  set @t = 16 
  while @t < 80 begin 
    set @W80 = @W80 + 
      dbo.S(1,cast(substring(@W80,(@t-3)*4+1,4) as bigint) 
             ^cast(substring(@W80,(@t-8)*4+1,4) as bigint) 
             ^cast(substring(@W80,(@t-14)*4+1,4) as bigint) 
             ^cast(substring(@W80,(@t-16)*4+1,4) as bigint)) 
    set @t = @t + 1 
  end 
  set @t = 0 
  while @t < 80 begin 
    set @TEMP = cast((cast(dbo.S(5,substring(@ABCDE,1,4)) as bigint) 
          + dbo.f(@t,substring(@ABCDE,5,4) 
                    ,substring(@ABCDE,9,4) 
                    ,substring(@ABCDE,13,4)) 
          + cast(substring(@ABCDE,17,4) as bigint) 
          + cast(substring(@W80,4*@t+1,4) as bigint) 
          + cast(substring(@K4,4*(@t/20)+1,4) as bigint))%@2_32 as 
binary(4)) 
    set @ABCDE = @TEMP+substring(@ABCDE,1,4) 
                  +dbo.S(30,substring(@ABCDE,5,4)) 
                  +substring(@ABCDE,9,8) 
    set @t = @t + 1 
  end 
  set @H5 
  = cast((cast(substring(@H5, 1,4) as bigint) + cast(substring(@ABCDE, 1,4) 
as bigint))% @2_32 as binary(4)) 
  + cast((cast(substring(@H5, 5,4) as bigint) + cast(substring(@ABCDE, 5,4) 
as bigint))% @2_32 as binary(4)) 
  + cast((cast(substring(@H5, 9,4) as bigint) + cast(substring(@ABCDE, 9,4) 
as bigint))% @2_32 as binary(4)) 
  + cast((cast(substring(@H5,13,4) as bigint) + cast(substring(@ABCDE,13,4) 
as bigint))% @2_32 as binary(4)) 
  + cast((cast(substring(@H5,17,4) as bigint) + cast(substring(@ABCDE,17,4) 
as bigint))% @2_32 as binary(4)) 
  return @H5 
end 

Вы можете использовать Encrypt_tdes. Анкет Зашифрованная строка намного длиннее оригинала, но это не должно быть проблемой - значение будет усечено. Шифрование + усечение должно получить результат, аналогичный значению хэша. Я не совсем уверен, доступно ли шифрование в 9.40, вероятно, нет. В этом случае вы должны рассчитать значение хэша на клиенте.

Если вы можете изменить структуру таблицы, вы можете использовать с опцией Vercols. Видеть Использование опции с VercolsАнкет Короче говоря: эта опция дает вам 2 дополнительных скрытых столбца: контрольная сумма для первоначально вставленной строки и количество изменений (обновлений) в строке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top