0

n1,n22 つの数値 (Int、Long、...)を非可換な方法で結合したい場合p*n1 + n2p任意の素数が適切な選択肢のように思えます。

ただし、多くのハッシュ オプションがバイト配列を返すため、現在、数値をバイト配列に置き換えようとしています。

a,b:Array[Byte]は同じ長さであると仮定します。

+単純にxor

しかし、「乗算」として何を使用すればよいですか?

p:Longa(n 任意) 素数、a:Array[Byte]任意の

もちろん、a長い乗算に変換してから、結果をバイト配列に戻すこともできます。それに関する問題は、意味をなすために、後続の xor とp*a同じ長さの " "が必要になることです。a2 つのバイト配列のうち短い方をゼロ拡張することでこれを回避できますが、その場合、バイト配列の長さが急速に大きくなります。

一方、pバイト配列に変換して、a. ここでの問題は、 が に(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などのチェックサム アルゴリズムが含まれます。または、長い文字列を短いバイト配列にマップするハッシュ アルゴリズムが既にある場合は、単純に 2 つのバイト配列を連結して組み合わせて、ハッシュ アルゴリズムを介して結果を再度実行します。変更または調整が必要な場合に操作できるパラメーターを提供するために、おそらく前後にパディングを行います。

于 2015-07-04T17:35:08.703 に答える