1

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

如果需要,为了提供一些上下文,我有两个表,它们具有以下简化格式:

  表 1 表 2

  编号 | 序列号 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)字段。虽然这对于第一个表中的列来说很好,但它会导致第二个表出现问题。

我希望能够转换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

但正如你所见,这不少于 1000

我也一直在玩dbms_cryptoutl_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 回答