k^=remaining_bytes[2]<<16;这段代码转换成Oracle function
时间: 2024-03-16 20:46:28 浏览: 26
以下是将 C++ 代码 `k^=remaining_bytes[2]<<16;` 转换为 Oracle 存储过程的示例:
```sql
CREATE OR REPLACE FUNCTION XOR_REMAINING_BYTES(p_remaining_bytes IN RAW) RETURN INTEGER AS
k INTEGER := 0;
BEGIN
k := BITXOR(k, TO_NUMBER(SUBSTR(p_remaining_bytes, 5, 1)) * POWER(2, 16));
RETURN k;
END;
```
在上面的代码中,函数的输入参数为 `p_remaining_bytes`,类型为 `RAW`,即原始字节类型。函数中声明了一个整数变量 `k`,并使用 `BITXOR` 函数进行异或操作,将异或结果保存到变量 `k` 中。具体实现中,使用 `SUBSTR` 函数取出 `p_remaining_bytes` 的第 5 个字节,并使用 `TO_NUMBER` 函数将其转换为数字类型,然后使用 `POWER` 函数计算 2 的 16 次方,最后将两个结果相乘得到左移 16 位的结果,再使用 `BITXOR` 函数进行异或操作。最后将变量 `k` 返回即可。
相关问题
将这段代码转换成Oracle function的函数
将这段代码转换成 Oracle function 的函数需要进行以下步骤:
1. 声明函数名、输入参数和返回值类型。
2. 将 C++ 代码中用到的头文件和命名空间去掉,因为在 Oracle 中不需要。
3. 将 C++ 代码中用到的函数 `_rotl` 改为 Oracle 中对应的函数 `BITROTATELEFT`,使用方法和 C++ 中的 `_rotl` 类似。
4. 将 C++ 代码中用到的 `cout` 和 `system` 函数去掉,因为在 Oracle 中不需要。
根据以上步骤,可以将这段代码转换成 Oracle function 的函数如下:
```sql
CREATE OR REPLACE FUNCTION Murmurhash3(input_data VARCHAR2, seed NUMBER)
RETURN NUMBER
IS
h NUMBER := seed;
c1 NUMBER := 0xcc9e2d51;
c2 NUMBER := 0x1b873593;
r1 NUMBER := 15;
r2 NUMBER := 13;
m NUMBER := 5;
n NUMBER := 0xe6546b64;
blkNums NUMBER := TRUNC(LENGTH(input_data) / 4);
remaining_bytes VARCHAR2(4);
k NUMBER := 0;
BEGIN
FOR i IN 0..blkNums-1 LOOP
DECLARE
s VARCHAR2(4);
res NUMBER := 0;
BEGIN
s := SUBSTR(input_data, i*4+1, 4);
FOR j IN 0..3 LOOP
res := res + ASCII(SUBSTR(s, j+1, 1)) * POWER(2, 24-j*8);
END LOOP;
res := BITROTATELEFT(res * c1, r1);
res := BITROTATELEFT(res * c2, r2);
h := h * m + n;
END;
END LOOP;
remaining_bytes := SUBSTR(input_data, blkNums*4+1, LENGTH(input_data)-blkNums*4);
CASE LENGTH(remaining_bytes)
WHEN 1 THEN k := ASCII(SUBSTR(remaining_bytes, 1, 1));
WHEN 2 THEN k := ASCII(SUBSTR(remaining_bytes, 1, 1)) + ASCII(SUBSTR(remaining_bytes, 2, 1)) * POWER(2, 8);
WHEN 3 THEN k := ASCII(SUBSTR(remaining_bytes, 1, 1)) + ASCII(SUBSTR(remaining_bytes, 2, 1)) * POWER(2, 8) + ASCII(SUBSTR(remaining_bytes, 3, 1)) * POWER(2, 16);
END CASE;
k := BITROTATELEFT(k * c1, r1);
k := BITROTATELEFT(k * c2, r2);
h := h XOR k;
h := h XOR LENGTH(input_data);
h := BITROTATELEFT(h, 16) XOR h;
h := BITROTATELEFT(h * 0x85ebca6b, 13);
h := BITROTATELEFT(h * 0xc2b2ae35, 16) XOR h;
RETURN h;
END;
/
```
注意:这段代码中使用了 Oracle 内置函数 `ASCII` 和 `POWER`,前者用于将字符转换为 ASCII 码,后者用于计算幂次方。另外,这段代码中使用了 `BITROTATELEFT` 函数,它是一个自定义函数,用于实现 C++ 代码中的 `_rotl` 函数的功能。
将这段代码转换成oracle function代码
以下是将 Murmurhash3 算法转换成 Oracle Function 的代码实现:
```sql
CREATE OR REPLACE FUNCTION murmurhash3(input_data VARCHAR2, seed NUMBER)
RETURN NUMBER
IS
h NUMBER := seed;
c1 NUMBER := 3385926951;
c2 NUMBER := 2664868223;
r1 NUMBER := 15;
r2 NUMBER := 13;
m NUMBER := 5;
n NUMBER := 2246822507;
blkNums NUMBER := LENGTH(input_data) / 4;
remaining_bytes VARCHAR2(4);
K NUMBER := 0;
res NUMBER := 0;
BEGIN
-- 分块处理
FOR i IN 0..blkNums-1 LOOP
K := ASCII(SUBSTR(input_data, i*4+1, 1)) * 16777216 +
ASCII(SUBSTR(input_data, i*4+2, 1)) * 65536 +
ASCII(SUBSTR(input_data, i*4+3, 1)) * 256 +
ASCII(SUBSTR(input_data, i*4+4, 1));
K := K * c1;
K := BITAND(BITOR(BITOR(K, 0), 0), 0xFFFFFFFF);
K := ROTL(K, r1);
K := K * c2;
K := BITAND(BITOR(BITOR(K, 0), 0), 0xFFFFFFFF);
h := MOD(h*m+n, 4294967296);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
h := BITXOR(h, K);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
h := MOD(h*m+n, 4294967296);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
END LOOP;
-- 处理剩余字节
remaining_bytes := SUBSTR(input_data, blkNums*4+1);
FOR i IN 1..LENGTH(remaining_bytes) LOOP
K := K + ASCII(SUBSTR(remaining_bytes, i, 1)) * POWER(256, LENGTH(remaining_bytes)-i);
END LOOP;
K := K * c1;
K := BITAND(BITOR(BITOR(K, 0), 0), 0xFFFFFFFF);
K := ROTL(K, r1);
K := K * c2;
K := BITAND(BITOR(BITOR(K, 0), 0), 0xFFFFFFFF);
h := BITXOR(h, K);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
h := BITXOR(h, LENGTH(input_data));
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
-- 加强雪崩测试
h := BITXOR(h, BITAND(BITSHR(h, 16), 65535));
h := MOD(h*2246822507, 4294967296);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
h := BITXOR(h, BITAND(BITSHR(h, 13), 524287));
h := MOD(h*3266489909, 4294967296);
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
h := BITXOR(h, BITSHR(h, 16));
h := BITAND(BITOR(BITOR(h, 0), 0), 0xFFFFFFFF);
RETURN h;
END;
```
在 Oracle Function 中,需要将部分 C++ 代码进行相应的调整。具体来说,由于 Oracle 中没有 _rotl 函数和 unsigned int 类型,需要使用位运算和 NUMBER 类型来替代。另外,由于 ASCII 函数返回的是字符的 ASCII 码值,需要将每个字符的 ASCII 码值转换为对应的数字。最后,由于 Oracle 中没有无符号整数,需要使用位运算和 MOD 函数来实现溢出和取模操作。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)