如果我想以非交换方式组合两个数字(Int,Long,...)n1,n2
,p*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
)
而且我能想得更多的废话。但是我应该怎样?什么是有道理的?