如果我想以非交换的方式组合两个数字(Int,Long,...)n1,n2
,p*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
)
我可以想到更多的废话。但应该我做什么?究竟有什么意义?
答案 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或 - 如果您已经有一个哈希算法将长字符串映射到一个短字节数组,只需连接要组合的两个字节数组并通过哈希算法运行结果再次,如果你需要改变或调整一些东西,可能会在前后添加一些填充,为你提供一些你可以玩的参数。