Mysql:用键异或一个字符串

icv*_*cvg 5 mysql string bit-manipulation xor

我想用 KEY 对字符串(实际上是它的二进制表示形式)进行按位异或。

运算结果应以十六进制表示。

我所拥有的: 'a' - 要更改的 UTF-8 字符串。'ACF123456' - 十六进制密钥。

结果显示为 BIGINT:

select CONV(HEX('a'), 16, 10)  ^  CONV('ACF123456', 16, 10);
Run Code Online (Sandbox Code Playgroud)

结果显示为十六进制:

select CONV( CONV(HEX('a'), 16, 10)  ^  CONV('ACF123456', 16, 10), 10, 16);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 上面的转换是否正确?
  2. 如果字符串太长(即我们用“a veeeeeery long string”代替“a”)会发生什么?似乎 conv() 函数有一个限制(是文档中的 64 位精度)吗?除了 XOR 运算符 ^ 之外,还有一个与 nr 有关的限制。返回结果的位数。有适用于任何字符串的解决方案(允许使用存储过程)吗?

谢谢。

Ran*_*eed 1

你的转换对我来说看起来很好。\n正如你所指出的,两者CONV()^都有 64 位精度。

\n\n

2^64 = 16^16,因此超过 16 个十六进制数字的字符串应该转换为大于 2^64 的整数。然而,当尝试将这些字符串转换为整数时,这些字符串将被残酷地(无声地)从左侧截断。

\n\n

我的解决方案的要点是对这些字符串进行切片。显然,结果可能不会显示为整数,而只能显示为字符串表示形式。

\n\n

@input 成为您的“要更改的字符串”,并且 @key是您的“密钥”。

\n\n
    \n
  1. 分配HEX(@input)@hex_input。从那时起这里就没有问题了HEX()可以使用字符串。
  2. \n
  3. @hex_input从右侧开始
  4. \n
  5. 同样,切片@key16 位长的字符串。
  6. \n
  7. 从右侧开始计算 的X-OR每个 64 位切片@hex_input与 的每个 64 位切片的。@key使用CONV(@slice, 16, 10)。如果 或@hex_input@key切片数少于另一个字符串,则X-OR另一个字符串的剩余切片为 0。
  8. \n
  9. 将第 4 点产生的每个 64 位数字转换X-OR回十六进制字符串:UNHEX()
  10. \n
  11. 重新组装生成的切片。这就是你的结果。
  12. \n
\n\n

三列表TEMPORARY可以用作数组来存储@hex_input,@mask生成的切片。

\n\n

将所有这些放在一个存储过程中,然后voil\xc3\xa0

\n\n

听起来你对MySQL有一些技能,你应该能够将上面的内容翻译成真正的代码。但如果您需要进一步的指导,我将很乐意提供帮助。

\n