1

簡単に言えば、任意の文字列を整数に変換できるようにしたいと考えています。できれば整数のサイズを制限し、結果が常に同じになるようにしたいと考えています。言い換えれば、オラクルがサポートする、数値を返すハッシュ関数があり、その値に最大値を設定できるでしょうか?

必要に応じてコンテキストを提供するために、次の簡略化された形式の 2 つのテーブルがあります。

  表 1 表 2

  ID | シーケンス番号 ID | シーケンス番号
  -------------------- -------------
  1 | 1 1 | 2QD44561
  1 | 2 1 | 6HH00244
  2 | 1 2 | 5DH08133
  3 | 1 3 | 7RD03098
  4 | 2 4 | 8BF02466

sequence_numbernumber(3)表 1 とvarchar2(11)表 2 にあります。これは、両方のテーブルの主キーの一部です。

データは外部から提供され、変更できません。表 1 では単純な順序で作成されていると思いますが、表 2 では意味があります。データは構成されていますが、代表的なものです。

number(3)フィールドを出力すると誰かが約束しました。これは最初のテーブルの列では問題ありませんが、2 番目のテーブルでは問題が発生します。

sequence_number1000未満の整数(簡単)に変換できるようにしたいと思います(より難しい) 可能な場合は定数です(一見不可能です)。'2QD44561'これは、常に戻りたいという意味です586。2 つの文字列が同じ数値を返すかどうかは問題ではありません。

使用できる整数に変換するだけutl_raw.cast_to_number()です:

select utl_raw.cast_to_number((utl_raw.cast_to_raw('2QD44561'))) from dual;

UTL_RAW.CAST_TO_NUMBER((UTL_RAW.CAST_TO_RAW('2QD44561')))
---------------------------------------------------------
                                               -2.033E+25

しかし、ご覧のとおり、これは 1000 未満ではありません。

また、何かを思いつくことができるかどうかを確認するためにdbms_cryptoandをいじっていましたが、小さな整数を取得することができませんでした。utl_encode方法はありますか?

4

2 に答える 2

4

どうora_hashですか?

select ora_hash(sequence_number, 999) from table_2;

... 最大 3 桁になります。でシードすることもできますがid、それが非常に少ない値で多くを追加するかどうかはわかりません。とにかくそれが必要かどうかもわかりません。

于 2012-06-21T14:16:47.587 に答える
1

あなたはハッシュ関数の使用について話している。そこにはたくさんの解決策があります - sha1 は非常に一般的です。

ただし、参考までに、「整数のサイズを制限する」と言うときは、無限の文字列または数値のセットを限られた値のセットにマッピングすることになることを理解してください。したがって、文字列が同じ場合は常に同じ値にマップされますが、その値にマップされる文字列はそれらだけではありません

于 2012-06-21T14:05:14.483 に答える