Mysql:xor带有键的字符串

时间:2012-06-13 13:14:43

标签: mysql string bit-manipulation xor

我想用一个KEY对一个字符串(实际上是它的二进制表示)进行Bitwise-XOR。

操作结果应表示为HEX。

我拥有的: 'a' - 要更改的UTF-8字符串。 'ACF123456' - HEX中的关键。

结果被视为BIGINT:

select CONV(HEX('a'), 16, 10)  ^  CONV('ACF123456', 16, 10);

结果显示为HEX:

select CONV( CONV(HEX('a'), 16, 10)  ^  CONV('ACF123456', 16, 10), 10, 16);

问题:

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

1 个答案:

答案 0 :(得分:1)

您的转化对我来说很好看。 正如您所指出的,CONV()^确实具有64位精度。

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

我在这里的解决方案是切片这样的字符串。显然,结果可能不会显示为整数,而只能显示为字符串表示。

@input 成为您的“要更改的字符串”和 @key您的“密钥”。

  1. HEX(@input)分配给@hex_input。这里没问题,因为HEX()适用于字符串。
  2. 从右侧
  3. 开始将@hex_input切成16个十六进制数字长字符串
  4. 同样,将@key切成16位长字符串。
  5. 从右侧开始,计算X-OR的每个64位切片的@hex_input和每个64位切片@key。使用CONV(@slice, 16, 10)。如果@hex_input@key的切片少于其他字符串,则X-OR另一个字符串的剩余切片为0。
  6. 将第4点的X-OR生成的每个64位数字转换回带UNHEX()的十六进制字符串。
  7. 重新组合生成的切片。这是你的结果。
  8. 可以将三列TEMPORARY表用作数组来存储@hex_input@mask的切片以及生成的切片。

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

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