SHA256-performance-Optimierung in C

Muss ich hash auf eine große Datenbank mit Werten ziemlich oft. So eine schnelle Implementierung der SHA-2-hasher benötigt wird. Ich bin derzeit mit der SHA256.

Den sha256_transform Algorithmus, den ich verwende im Moment ist dieses:
http://bradconte.com/sha256_c
(code unten)

Ich habe profilierten mein code-snippet ist man genau 96% der Rechenzeit pro hash, so dass diese Funktion entscheidend, um meine Ziele zu erreichen.

Es arbeitet auf einer 64-byte-langen Binär-Zeichenfolge mit dem Namen data[] aus und gibt das Ergebnis in ctx->state.

Bitte ich um eine schnellere version dieser Funktion. Bedenken Sie, dass selbst geringfügige änderungen können Auswirkungen auf die Geschwindigkeit negativ.

#define uchar unsigned char
#define uint unsigned int

#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))

#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))

void sha256_transform(SHA256_CTX *ctx, uchar data[]) {
    uint a,b,c,d,e,f,g,h,i,j,t1,t2,m[64];

    a = ctx->state[0];
    b = ctx->state[1];
    c = ctx->state[2];
    d = ctx->state[3];
    e = ctx->state[4];
    f = ctx->state[5];
    g = ctx->state[6];
    h = ctx->state[7];

    for (i=0,j=0; i < 16; i++, j += 4)
        m[i] = (data[j] << 24) | (data[j+1] << 16) | (data[j+2] << 8) | (data[j+3]);

    for ( ; i < 64; i++)
        m[i] = SIG1(m[i-2]) + m[i-7] + SIG0(m[i-15]) + m[i-16];

    for (i = 0; i < 64; ++i) {
        t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
        t2 = EP0(a) + MAJ(a,b,c);
        h = g;
        g = f;
        f = e;
        e = d + t1;
        d = c;
        c = b;
        b = a;
        a = t1 + t2;
    }

    ctx->state[0] += a;
    ctx->state[1] += b;
    ctx->state[2] += c;
    ctx->state[3] += d;
    ctx->state[4] += e;
    ctx->state[5] += f;
    ctx->state[6] += g;
    ctx->state[7] += h;
}
Wenn Sie glücklich sind, beschränken Sie Ihre code zu x86-dann sieht es aus wie könnte es Chancen für SIMD-Optimierung mit SSE/AVX2.
Es dauert 96% der Zeit nicht, weil es schlecht geschrieben ist, sondern weil es von Natur aus Komplex. Dies wurde optimiert ziemlich gut, also, wenn Sie brauchen, um zu verbringen weniger Zeit computing, suchen Sie nach Möglichkeiten zu nennen, die es weniger oft.
Gibt es etwas, was deinen aktuellen code nicht tun können, gerade jetzt, weil das ist unter Ihre CPU, um neue thermische Höhen?
+1 für den gesunden Menschenverstand. Alternativ, ich weiß multithreading ist ein muss-hier haben, aber es ist nicht der Punkt der Frage. Eigentlich ja, ich Frage deshalb, weil sowohl die Geschwindigkeit UND überhitzen des Prozessors.

InformationsquelleAutor user2464424 | 2013-08-31

Schreibe einen Kommentar