三个输入的廉价哈希独立于他们的顺序

时间:2014-11-14 18:33:01

标签: hash vhdl fpga boolean-logic boolean-operations

我有一个带三个输入的模块,每个输入都是三位宽。

output = f(inputA, inputB, inputC)

输出取决于三个输入的值,但不依赖于它们的顺序。

即。 f(inputA, inputB, inputC) = f(inputB, inputC, inputA)

该解决方案应该适用于FPGA和ASIC。目前我正在实现它而没有利用对称性,但我认为明确强制合成器考虑对称性将导致更好的实现。

我计划使用不依赖于它们的顺序的三个输入的散列h来实现它。然后我可以这样做:

hash <= h(inputA, inputB, inputC);

output <= VALUE0 when hash = 0 else
          VALUE1 when hash = 1 else
          .....

我的问题是我应该如何使用哈希函数?

到目前为止我的想法:

如果每个输入是3位宽,则有512种可能性,但在考虑对称性时只有120种,所以理论上我应该能够使用7位宽的散列。实际上它可能需要更长时间。

散列的每个位都是输入位的函数,必须遵守三个输入的对称性。散列的位应该彼此独立。但我不确定如何生成这些功能。

1 个答案:

答案 0 :(得分:1)

正如您的问题所述,您可以排序并连接您的输入

在伪代码中:

if (A < B)
    swap(A, B);
if (B < C)
    swap(B, C);
if (A < B)
    swap(A, B);

作为框图:

enter image description here

“条件交换”块所需的6输入/ 6输出功能:

A3x = A3 B3 ;
A2x = A3 B3' B2  + A3' A2 B3  + A2 B2 ;
A1x = A2 B3' B2' B1 + A3' A2' A1 B2  + A3 A2 B2' B1 
    + A2' A1 B3 B2  + A3 B3' B1 + A3' A1 B3  + A1 B1;
B3x = B3  + A3 ;
B2x = A3' B2  + A2 B3'  + B3 B2  + A3 A2 ;
B1x = A3' A2' B1 + A1 B3' B2'  + A2' B3 B1 + A3 A1 B2'  
    + A3' B2 B1 + A2 A1 B3'  + A3' B3 B1 + A3 A1 B3'  
    + B3 B2 B1 + A3 A2 A1 ;

我不得不承认这个解决方案并不完全“便宜”,导致9位哈希而不是7位哈希。因此,查找表实际上可能是最佳解决方案。