Skip to content

Commit 3bdfd98

Browse files
committed
Use SipHash for _imp.source_hash
1 parent b0a33ff commit 3bdfd98

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import static com.oracle.graal.python.nodes.StringLiterals.T_EXT_SO;
5454
import static com.oracle.graal.python.nodes.StringLiterals.T_NAME;
5555
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
56+
import static com.oracle.graal.python.util.PythonUtils.ARRAY_ACCESSOR;
5657
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
5758
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;
5859
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
@@ -61,6 +62,9 @@
6162
import java.util.List;
6263
import java.util.concurrent.locks.ReentrantLock;
6364

65+
import org.bouncycastle.crypto.macs.SipHash;
66+
import org.bouncycastle.crypto.params.KeyParameter;
67+
6468
import com.oracle.graal.python.PythonLanguage;
6569
import com.oracle.graal.python.annotations.ArgumentClinic;
6670
import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion;
@@ -72,7 +76,6 @@
7276
import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins.Marshal.MarshalError;
7377
import com.oracle.graal.python.builtins.objects.PNone;
7478
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
75-
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
7679
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7780
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
7881
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.ModuleSpec;
@@ -125,6 +128,7 @@
125128
import com.oracle.truffle.api.dsl.Specialization;
126129
import com.oracle.truffle.api.frame.VirtualFrame;
127130
import com.oracle.truffle.api.interop.InteropLibrary;
131+
import com.oracle.truffle.api.library.CachedLibrary;
128132
import com.oracle.truffle.api.memory.ByteArraySupport;
129133
import com.oracle.truffle.api.nodes.Node;
130134
import com.oracle.truffle.api.source.Source;
@@ -702,22 +706,28 @@ private static void raiseFrozenError(Node inliningTarget, PConstructAndRaiseNode
702706
@ArgumentClinic(name = "source", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer)
703707
@GenerateNodeFactory
704708
public abstract static class SourceHashNode extends PythonBinaryClinicBuiltinNode {
705-
@TruffleBoundary
706-
@Specialization
709+
@Specialization(limit = "2")
707710
static PBytes run(long magicNumber, Object sourceBuffer,
711+
@CachedLibrary("sourceBuffer") PythonBufferAccessLibrary bufferLib,
708712
@Bind PythonLanguage language) {
709-
long sourceHash = BytesNodes.HashBufferNode.executeUncached(sourceBuffer);
710-
return PFactory.createBytes(language, computeHash(magicNumber, sourceHash));
713+
try {
714+
byte[] hash = hashSource(magicNumber, bufferLib.getInternalOrCopiedByteArray(sourceBuffer), bufferLib.getBufferLength(sourceBuffer));
715+
return PFactory.createBytes(language, hash);
716+
} finally {
717+
bufferLib.release(sourceBuffer);
718+
}
711719
}
712720

713721
@TruffleBoundary
714-
private static byte[] computeHash(long magicNumber, long sourceHash) {
715-
byte[] hash = new byte[Long.BYTES];
716-
long hashCode = magicNumber ^ sourceHash;
717-
for (int i = 0; i < hash.length; i++) {
718-
hash[i] = (byte) (hashCode << (8 * i));
719-
}
720-
return hash;
722+
public static byte[] hashSource(long magicNumber, byte[] bytes, int length) {
723+
SipHash sipHash = new SipHash(1, 3);
724+
byte[] key = new byte[16];
725+
ARRAY_ACCESSOR.putLong(key, 0, magicNumber);
726+
sipHash.init(new KeyParameter(key));
727+
sipHash.update(bytes, 0, length);
728+
byte[] out = new byte[sipHash.getMacSize()];
729+
sipHash.doFinal(out, 0);
730+
return out;
721731
}
722732

723733
@Override

0 commit comments

Comments
 (0)