将任何字符串转换为整数

Ben*_*Ben 2 sql oracle hash oracle11gr2

简而言之,我希望能够将任何字符串转换为整数,最好能够限制整数的大小并确保结果始终相同。换句话说,是否有 Oracle 支持的散列函数返回一个数值,并且该值是否有最大值?

为了在需要时提供一些上下文,我有两个具有以下简化格式的表:

  表1 表2

  编号 | 序列号 ID | 序列号
  -------------------- -------------
  1 | 1 1 | 1 2QD44561
  1 | 2 1 | 2 6HH00244
  2 | 1 2 | 5DH08133
  3 | 1 3 | 7RD03098
  4 | 2 4 | 8BF02466

栏目sequence_number见表number(3)1、varchar2(11)表2;它是两个表中主键的一部分。

数据是外部提供的,无法更改;我相信,在表 1 中,它是由一个简单的序列创建的,但在表 2 中是有含义的。数据是虚构的,但具有代表性。

有人答应我们会输出一个number(3)字段。虽然这对于第一个表中的列来说很好,但对于第二个表中的列却会导致问题。

我希望能够转换sequence_number为整数(简单),小于 1000(更难),并且如果可能的话是常数(似乎不可能)。这意味着我'2QD44561'愿意永远回来586。如果两个字符串返回相同的数字,那并不重要。

只需转换为整数我就可以使用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
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,这不少于 1000

我也一直在玩弄dbms_cryptoutl_encode看看我是否能想出一些东西,但我还没有设法得到一个小整数。有办法吗?

Ale*_*ole 5

怎么样ora_hash

select ora_hash(sequence_number, 999) from table_2;
Run Code Online (Sandbox Code Playgroud)

...将产生最多 3 位数字。你也可以用id我想的来播种它,但不确定用这么少的值会增加多少,而且我不确定你是否会想要这样。