Created
January 10, 2019 04:14
-
-
Save funorpain/398ab45182c0688b6288b9f5a4beda62 to your computer and use it in GitHub Desktop.
siphash 64 java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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