2015-07-04 54 views
0

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

虽然许多哈希选项返回一个字节数组,但我现在试图用字节数组替换数字。

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

+简直变成一个xor

但我应该为“乘法”使用?

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

我当然可以,转换a到一个长期,大量繁殖,然后将结果转换回字节数组。问题在于我需要“p*a”的长度与a的长度相同,以便随后的xor有意义。我可以通过零扩展两个字节数组中的较短的数组来避开这种情况,但是随后字节数组的长度会迅速增加。

另一方面,我可以将p转换为一个字节数组,并与a进行异或运算。在这里,问题是那(p*(p*a+b)+c)变成(a+b+c),这是交换,我们不想要。

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

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

我可以通过一些f(p)位循环移位a(并希望它并没有结束再次成为a

而且我能想得更多的废话。但是我应该怎样?什么是有道理的?

回答

0

如果你想模仿乘以素数的原始理想,显而易见的泛化就是在伽罗华域GF(2^8)中进行算术 - 参见https://en.wikipedia.org/wiki/Finite_field_arithmetic并注意你可以基本上使用log和antilog表大小为256,用表查找替代乘法 - https://en.wikipedia.org/wiki/Finite_field_arithmetic#Implementation_tricks。在任何类型的有限域上进行算术运算都会有许多优秀的算术模数的性质 - 如果您愿意,算术模p可以是GP(p)或GF(p^1)。

但是,这一切都未尝试过,也许有点高飞。其他选项包括校验和算法,例如https://en.wikipedia.org/wiki/Adler-32,或者 - 如果您已经有一种将长字符串映射为短字节数组的散列算法,则简单地将要组合的两个字节数组连接起来,并再次通过散列算法运行结果,如果你需要改变或调整某些东西,可以使用前后的一些填充来给你一些参数。