2

Informix SQL で、列値のある種のハッシュ値またはチェックサム値を計算したいと考えています。

問題:

テストデータの個人情報を匿名化する必要があり、次のように関連する値をハッシュすることで実現したいと考えています。

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

固定値だけでなくハッシュを使用したいのは、異なる値を (一般的に) 異なる結果にマップし、同じ値を同じ結果にマップするのに役立つからです。これにより、テスト データの比較を引き続き行うことができます (たとえば、同じ employee_no を持つ複数のレコードを持つことができ、その情報を保持すると便利です)。

ほとんどの DBMS には何らかのハッシュ関数があります (PostgreSQL と MySQL には MD5() があり、Oracle には DBMS_UTILITY.GET_HASH_VALUE があります) が、Informix (Informix IDS 9) については何も見つかりませんでした。これは欠落している機能ですか?

4

4 に答える 4

1

sleske、

数年前、SHA-1ハッシュを計算するT-SQL関数を作成しました。それがうまくいくなら、多分あなたは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 
于 2009-09-25T15:10:52.053 に答える
1

ENCRYPT_TDESを使用できます。暗号化された文字列は元の文字列よりもはるかに長いですが、これは問題にはなりません。値は切り捨てられます。暗号化 + 切り捨てにより、ハッシュ値と同様の結果が得られるはずです。9.40 で暗号化が利用できるかどうかはよくわかりませんが、おそらく利用できないでしょう。その場合、クライアントでハッシュ値を計算する必要があります。

于 2009-12-10T21:38:59.967 に答える
1

IDS には、組み込み関数、AFAICR として公開されているハッシュ関数はありません。

IBM Informix Dynamic Server (IDS) バージョン 10.00 以降 (以前のバージョンはサポートされていません。7.31 は 2009 年 9 月 30 日までサポートされていますが、それ以降はサポートされていません) を使用していると仮定すると、UDR (user-定義されたルーチン) がジョブを実行します。これは信じられないほど難しいことではありませんが、些細なことでもありません。

于 2009-09-27T03:33:13.723 に答える
0

テーブル構造を変更できる場合は、WITH VERCOLS オプションを使用できます。WITH VERCOLS オプションの使用を参照してください。要するに、このオプションでは、最初に挿入された行のチェックサムと行の変更 (更新) 数の 2 つの追加の非表示の列が提供されます。

于 2009-12-10T15:03:21.707 に答える