两个字节数组的非交换组合

时间:2015-07-04 16:29:54

标签: arrays algorithm byte checksum commutativity

如果我想以非交换的方式组合两个数字(Int,Long,...)n1,n2p*n1 + n2其中p是一个任意素数似乎足够合理选择。

尽管许多散列选项返回一个字节数组,但我现在正试图用字节数组替换数字。

假设a,b:Array[Byte]长度相同。

+只是成为xor

但我应该将什么用作"乘法"?

p:Long a(任意)素数,任意长度的a:Array[Byte]

当然,我可以将a转换为long,multiply,然后将结果转换回Bytes数组。问题是我需要" p*a"与a的长度相同,以便随后的xor有意义。我可以通过零扩展两个字节数组中的较短者来避免这种情况,但随后字节数组的长度会快速增长。

另一方面,我可以将p转换为字节数组,并将其转换为a。在这里,问题是(p*(p*a+b)+c)成为(a+b+c),这是可交换的,我们不想要。

我可以将p添加到数组中的每个字节(抛弃溢出)。

我可以将p添加到数组中的每个字节(不要丢弃溢出)。

我可以循环移位a一些f(p)位(希望它不会再次成为a

我可以想到更多的废话。但应该我做什么?究竟有什么意义?

1 个答案:

答案 0 :(得分:0)

如果你想模仿乘以素数的原始理想,那么显而易见的概括是在伽罗瓦域GF(2 ^ 8)中进行算术运算 - 参见https://en.wikipedia.org/wiki/Finite_field_arithmetic并注意你基本上可以使用log和大小为256的反对数表以替换乘法而不是表查找 - https://en.wikipedia.org/wiki/Finite_field_arithmetic#Implementation_tricks。任何类型的有限域上的算术将具有算术模的许多优良属性 - 如果您愿意,算术模p是GP(p)或GF(p ^ 1)。

然而,这一切都是未经验证的,也许有点高飞。其他选项包括校验和算法,如https://en.wikipedia.org/wiki/Adler-32或 - 如果您已经有一个哈希算法将长字符串映射到一个短字节数组,只需连接要组合的两个字节数组并通过哈希算法运行结果再次,如果你需要改变或调整一些东西,可能会在前后添加一些填充,为你提供一些你可以玩的参数。

相关问题