如果我想以n1,n2
非交换方式组合两个数字(Int,Long,...),那么任意素数p*n1 + n2
在哪里p
似乎是一个足够合理的选择。
但是,由于许多散列选项返回一个字节数组,我现在尝试用字节数组替换数字。
假设a,b:Array[Byte]
长度相同。
+
简单地变成了一个xor
但我应该用什么作为“乘法”?
p:Long
一个(n 任意)素数a:Array[Byte]
,任意长度
当然,我可以转换a
为长整数乘法,然后将结果转换回字节数组。这样做的问题是我需要 " p*a
" 的长度与随后的 xor 的长度相同a
才能有意义。我可以通过零扩展两个字节数组中较短的一个来规避这个问题,但随后字节数组的长度会迅速增长。
另一方面,我可以转换p
为字节数组并与a
. 在这里,问题是 then(p*(p*a+b)+c)
变成(a+b+c)
,这是可交换的,我们不想要。
我可以将 p 添加到数组中的每个字节(丢弃溢出)。
我可以将 p 添加到数组中的每个字节(而不是丢弃溢出)。
我可以循环移动a
一些f(p)
位(并希望它不会a
再次变成)
我还能想到更多的废话。但是我该怎么办?实际上有什么意义?