Hash 三个输入的廉价散列,与它们的顺序无关

Hash 三个输入的廉价散列,与它们的顺序无关,hash,vhdl,fpga,boolean-logic,boolean-operations,Hash,Vhdl,Fpga,Boolean Logic,Boolean Operations,我有一个模块,它接受三个输入,每个输入都有三位宽 output = f(inputA, inputB, inputC) 输出取决于三个输入的值,但不取决于它们的顺序 i、 e.f(输入,输入B,输入UTC)=f(输入B,输入UTC,输入UTC) 该解决方案应适用于FPGA和ASIC。目前,我在不利用对称性的情况下实现它,但是我假设显式地强迫合成器考虑对称性将导致更好的实现。 我计划使用三个输入中的散列h来实现这一点,这三个输入不依赖于它们的顺序。我可以这样做: hash <= h(inp

我有一个模块,它接受三个输入,每个输入都有三位宽

output = f(inputA, inputB, inputC)
输出取决于三个输入的值,但不取决于它们的顺序

i、 e.
f(输入,输入B,输入UTC)=f(输入B,输入UTC,输入UTC)

该解决方案应适用于FPGA和ASIC。目前,我在不利用对称性的情况下实现它,但是我假设显式地强迫合成器考虑对称性将导致更好的实现。 我计划使用三个输入中的散列h来实现这一点,这三个输入不依赖于它们的顺序。我可以这样做:

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

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

hash正如您在问题中提到的,您可以对输入进行排序和连接

在伪代码中:

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

我必须承认,这个解决方案并不“便宜”,结果是9位哈希而不是7位哈希。因此,查找表实际上可能是最好的解决方案。

此外,我还尝试使用排序函数作为散列,它返回按升序排序并连接的输入,但是,此操作成本太高,几乎否定了使用较小查找表的优势。直接建议使用
hash=a xor b xor c
,但这当然只有3位宽——我不知道这是否足够满足您的需要。我需要唯一的哈希,这意味着哈希必须至少有7位长。但是是的,这三个位元肯定是有意义的。我感觉实现像那样的密集散列所需的函数本身就需要一个512条目的查找表。若你们打算在延迟线或其他地方保存大量的输入,那个可能是公平的,但我认为若它直接进入函数查找,那个么它不会为你们节省太多。我敢打赌,您的合成工具已经在分析函数的解决方案空间(等于或小于120个唯一输出),以获得有效的实现。取决于它的功能,它可能不仅仅通过对称性(自动)进行优化。
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 ;