将任何字符串转换为整数

时间:2012-06-21 13:57:32

标签: sql oracle hash oracle11gr2

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

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

  Table 1                  Table 2

  id | sequence_number     id | sequence_number
  --------------------     -------------
  1  | 1                    1 | 2QD44561
  1  | 2                    1 | 6HH00244
  2  | 1                    2 | 5DH08133
  3  | 1                    3 | 7RD03098
  4  | 2                    4 | 8BF02466

表1中的sequence_number列为number(3),表2中为varchar2(11);它是两个表中主键的一部分。

数据是外部提供的,无法更改;在表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,看看我是否能想出一些东西,但我没有设法得到一个小整数。有办法吗?

2 个答案:

答案 0 :(得分:4)

ora_hash怎么样?

select ora_hash(sequence_number, 999) from table_2;

...最多会产生3位数字。您也可以使用我想到的id播种它,但不确定是否会增加很少的值,而且我不确定您是否还想要它。

答案 1 :(得分:1)

您正在谈论使用哈希函数。有很多解决方案 - sha1很常见。

但仅仅是FYI,当你说“限制整数的大小”时,你就会明白你将把一组无限的字符串或数字映射到一组有限的值上。因此,虽然字符串在相同时始终映射到相同的值,但它们不是映射到该值的唯一字符串