简单地说,我希望能够将任何字符串转换为整数,最好能够限制整数的大小并确保结果始终相同。换句话说,是否有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_crypto
和utl_encode
,看看我是否能想出一些东西,但我没有设法得到一个小整数。有办法吗?
答案 0 :(得分:4)
ora_hash
怎么样?
select ora_hash(sequence_number, 999) from table_2;
...最多会产生3位数字。您也可以使用我想到的id
播种它,但不确定是否会增加很少的值,而且我不确定您是否还想要它。
答案 1 :(得分:1)
您正在谈论使用哈希函数。有很多解决方案 - sha1很常见。
但仅仅是FYI,当你说“限制整数的大小”时,你就会明白你将把一组无限的字符串或数字映射到一组有限的值上。因此,虽然字符串在相同时始终映射到相同的值,但它们不是映射到该值的唯一字符串