Neo4j中如何对十六进制进行按位运算

时间:2019-06-19 16:51:04

标签: neo4j cypher

我们有Apoc支持Neo4j中的许多功能。但是我想知道我们是否可以对Neo4j中的十六进制执行按位运算。

我的计划是首先使用apoc.util.md5将两个字符串转换为两个哈希值。然后,我想使用apoc.bitwise.op对这两个哈希值进行按位运算。但是,apoc.util.md5给出一个十六进制字符串,而apoc.bitwise.op只能采用整数。此外,我们知道,md5散列会产生128位结果,这超出了Integer的范围。因此,我想知道是否还有其他方法可以对十六进制字符串执行按位运算。

1 个答案:

答案 0 :(得分:0)

以下是非移位按位操作的一种方法概述(但最好编写自己的插件直接执行):

  1. 将32个字符宽的输入十六进制字符串拆分为4个单独的8个字符宽的字符串。类似地,拆分另一个操作数(也假定为32个字符宽的输入十六进制字符串)。
  2. 使用apoc.convert.toInteger将每个8个字符宽的十六进制字符串(在每个前缀以“ 0x”开头之后)转换为整数。
  3. 对每个对应的整数对执行按位运算。
  4. 使用apoc.text.hexValue将每个整数结果转换回十六进制,并在前面添加足够的“ 0”字符以达到8个字符的宽度。
  5. 将4个十六进制字符串重新组合为一个32个字符宽的十六进制字符串。

在Cypher中,假设输入的32个字符宽的十六进制字符串,按位运算(例如'|')和另一个操作数作为parameters $input,{{ 1}}和$operation

$operand

实际上,以上内容实际上可以在一个简洁的子句中完成:

WITH [i IN RANGE(0, 24, 8) |
  "0000000" + apoc.text.hexValue(
    apoc.bitwise.op(
      apoc.convert.toInteger("0x" + SUBSTRING($input, i, 8)),
      $operation,
      apoc.convert.toInteger("0x" + SUBSTRING($operand, i, 8))))
  ] AS x
RETURN REDUCE(r = "", s IN x | r + SUBSTRING(s, LENGTH(s)-8)) AS res;