Mysql:用键对字符串进行异或

标签 mysql string bit-manipulation xor

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

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

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

结果被视为 BIGINT:

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

结果被视为十六进制:

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

问题:

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

谢谢。

最佳答案

我认为您的转化效果不错。 正如你所指出的,CONV()^确实有 64 位精度。

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

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

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

  1. HEX(@input) 分配给 @hex_input。这里没问题,因为 HEX() 可以处理字符串。
  2. @hex_input切成16进制长串,从右边开始
  3. 同样,将@key 切成16 位长字符串。
  4. 计算 @hex_input 的每个 64 位切片与 @key 的每个 64 位切片的X-OR,从正确的。使用 CONV(@slice, 16, 10)。如果 @hex_input@key 的切片比另一个字符串少,则将另一个字符串的剩余切片与 0 进行异或
  5. 使用 UNHEX() 将第 4 点中的 X-OR 生成的每个 64 位数字转换回十六进制字符串。
  6. 重新组合生成的切片。这是你的结果。

一个三列的 TEMPORARY 表可以用作一个数组来存储 @hex_input@mask 的切片和结果切片。

将所有这些放在一个存储过程中,!

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

关于Mysql:用键对字符串进行异或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015628/

相关文章:

php - 如何检查mysql更新查询是否成功?

php - mySQL 升级后的问题

php - 将列名作为 json 对象属性公开是否存在安全风险?

javascript - jquery中分割字符串

c++ - 既然可以使用=运算符给字符串赋值,为什么还要在赋值前使用new运算符动态分配内存给字符串呢?

c - 如何检查有符号整数是否为正数?

php - 我应该在客户端代码中使用多个 SQL 查询还是多个循环?

c++ - gcc 的非空终止字符串编译器选项

algorithm - 找到二进制数1的索引,即2的幂

mysql - 索引搜索是否适用于带有按位运算的 where 子句?