Как делать побитовые операции для шестнадцатеричного в Neo4j - PullRequest
0 голосов
/ 19 июня 2019

У нас есть Apoc для поддержки большого количества функций в Neo4j.Но мне интересно, можем ли мы выполнять побитовые операции с шестнадцатеричным в Neo4j.

Мой план состоит в том, чтобы сначала преобразовать две строки в два значения хеша, используя apoc.util.md5.И затем я предполагаю использовать apoc.bitwise.op для выполнения побитовой операции с этими двумя значениями хеша.Однако apoc.util.md5 дает шестнадцатеричную строку, в то время как apoc.bitwise.op может принимать только целое число.Кроме того, как мы знаем, хеш md5 дает 128-битный результат, который находится вне диапазона Integer.Поэтому мне интересно, может ли какой-либо другой подход реализовать битовую операцию с шестнадцатеричной строкой.

1 Ответ

0 голосов
/ 19 июня 2019

Вот схема одного из способов сделать это для битовых операций без смещения (но может быть лучше написать собственный плагин, чтобы сделать это напрямую):

  1. Разделите входную шестнадцатеричную строку шириной 32 символа на 4 отдельные строки шириной 8 символов. Аналогично разделите другой операнд (также предполагается, что это входная шестнадцатеричная строка шириной 32 символа).
  2. Используйте apoc.convert.toInteger , чтобы преобразовать каждую шестнадцатеричную строку шириной 8 символов (после каждого префикса с "0x") в целое число.
  3. Выполнить побитовую операцию для каждой соответствующей пары целых чисел.
  4. Используйте apoc.text.hexValue , чтобы преобразовать каждый целочисленный результат обратно в шестнадцатеричный формат и предварительно добавить достаточно «0» символов вперед, чтобы получить ширину 8 символов.
  5. Объединить 4 шестнадцатеричные строки обратно в одну шестнадцатеричную строку шириной 32 символа.

В Cypher, предполагая, что входная шестнадцатеричная строка шириной 32 символа, побитовая операция (например, '|') и другой операнд передаются как параметры $input, $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;

Фактически, все вышеперечисленное можно сделать одним кратким предложением:

RETURN REDUCE(r = "",
  s IN [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))))] |
  r + SUBSTRING(s, LENGTH(s)-8)
) AS res;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...