Skip to content

Instantly share code, notes, and snippets.

@funorpain
Created January 10, 2019 04:14
Show Gist options
  • Save funorpain/398ab45182c0688b6288b9f5a4beda62 to your computer and use it in GitHub Desktop.
Save funorpain/398ab45182c0688b6288b9f5a4beda62 to your computer and use it in GitHub Desktop.
siphash 64 java
package com.example;
public class Main {
private static final int cROUNDS = 2;
private static final int dROUNDS = 4;
public static long ROTL(long value, int n) {
return (value << n) | (value >>> (64 - n));
}
// Translated from https://github.com/veorq/SipHash/blob/master/siphash.c
public static long siphash(byte[] buffer, long k0, long k1) {
long v0 = 0x736f6d6570736575L;
long v1 = 0x646f72616e646f6dL;
long v2 = 0x6c7967656e657261L;
long v3 = 0x7465646279746573L;
final int end = buffer.length - buffer.length % 8;
final int left = buffer.length & 7;
long b = ((long) buffer.length) << 56;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
int pos = 0;
for (; pos < end; pos += 8) {
long m = ((long) (buffer[pos] & 0xff))
| (((long) (buffer[pos + 1] & 0xff)) << 8)
| (((long) (buffer[pos + 2] & 0xff)) << 16)
| (((long) (buffer[pos + 3] & 0xff)) << 24)
| (((long) (buffer[pos + 4] & 0xff)) << 32)
| (((long) (buffer[pos + 5] & 0xff)) << 40)
| (((long) (buffer[pos + 6] & 0xff)) << 48)
| (((long) (buffer[pos + 7] & 0xff)) << 56);
v3 ^= m;
for (int i = 0; i < cROUNDS; ++i) {
v0 += v1;
v1 = ROTL(v1, 13);
v1 ^= v0;
v0 = ROTL(v0, 32);
v2 += v3;
v3 = ROTL(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = ROTL(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = ROTL(v1, 17);
v1 ^= v2;
v2 = ROTL(v2, 32);
}
v0 ^= m;
}
switch (left) {
case 7:
b |= ((long) (buffer[pos + 6] & 0xff)) << 48;
case 6:
b |= ((long) (buffer[pos + 5] & 0xff)) << 40;
case 5:
b |= ((long) (buffer[pos + 4] & 0xff)) << 32;
case 4:
b |= ((long) (buffer[pos + 3] & 0xff)) << 24;
case 3:
b |= ((long) (buffer[pos + 2] & 0xff)) << 16;
case 2:
b |= ((long) (buffer[pos + 1] & 0xff)) << 8;
case 1:
b |= ((long) (buffer[pos + 0] & 0xff));
break;
case 0:
break;
}
v3 ^= b;
for (int i = 0; i < cROUNDS; ++i) {
v0 += v1;
v1 = ROTL(v1, 13);
v1 ^= v0;
v0 = ROTL(v0, 32);
v2 += v3;
v3 = ROTL(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = ROTL(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = ROTL(v1, 17);
v1 ^= v2;
v2 = ROTL(v2, 32);
}
v0 ^= b;
v2 ^= 0xff;
for (int i = 0; i < dROUNDS; ++i) {
v0 += v1;
v1 = ROTL(v1, 13);
v1 ^= v0;
v0 = ROTL(v0, 32);
v2 += v3;
v3 = ROTL(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = ROTL(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = ROTL(v1, 17);
v1 ^= v2;
v2 = ROTL(v2, 32);
}
b = v0 ^ v1 ^ v2 ^ v3;
return b;
}
public static void main(String[] args) {
System.out.println(siphash("a".getBytes(), 0, 0));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment