0

如果我想以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再次变成)

我还能想到更多的废话。但是我该怎么?实际上有什么意义?

4

1 回答 1

0

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

然而,这一切都相当未经尝试,也许有点夸张。其他选项包括校验和算法,例如https://en.wikipedia.org/wiki/Adler-32或 - 如果您已经有一个哈希算法将长字符串映射到一个短字节数组,只需将两个字节数组连接到组合并再次通过哈希算法运行结果,可能在前后添加一些填充,以便在需要更改或调整事物时为您提供一些可以使用的参数。

于 2015-07-04T17:35:08.703 回答