n1,n2
2 つの数値 (Int、Long、...)を非可換な方法で結合したい場合p*n1 + n2
、p
任意の素数が適切な選択肢のように思えます。
ただし、多くのハッシュ オプションがバイト配列を返すため、現在、数値をバイト配列に置き換えようとしています。
a,b:Array[Byte]
は同じ長さであると仮定します。
+
単純にxor
しかし、「乗算」として何を使用すればよいですか?
p:Long
a(n 任意) 素数、a:Array[Byte]
任意の長さ
もちろん、a
長い乗算に変換してから、結果をバイト配列に戻すこともできます。それに関する問題は、意味をなすために、後続の xor とp*a
同じ長さの " "が必要になることです。a
2 つのバイト配列のうち短い方をゼロ拡張することでこれを回避できますが、その場合、バイト配列の長さが急速に大きくなります。
一方、p
バイト配列に変換して、a
. ここでの問題は、 が に(p*(p*a+b)+c)
なる(a+b+c)
ことです。これは可換であり、望ましくありません。
配列内のすべてのバイトに p を追加できます (オーバーフローを破棄します)。
配列内のすべてのバイトに p を追加できます (オーバーフローを破棄しません)。
a
私はいくつかのビットで循環シフトすることができましたf(p)
(そしてそれが再びならないことを願っていますa
)
そして、もっとナンセンスなことを考えることができました。しかし、私は何をすべきですか?実際には何が理にかなっていますか?