static VALUE hamming_distance(VALUE self, VALUE a, VALUE b) { int result = 0; result = ph_hamming_distance(NUM2ULL(a), NUM2ULL(b)); if (-1 == result) { rb_raise(rb_eRuntimeError, "Unknown pHash error"); } return INT2NUM(result); }
float dctImage_distance(DP *pntA, DP *pntB) { ulong64 *hashA = (ulong64*)pntA->hash; ulong64 *hashB = (ulong64*)pntB->hash; float res = ph_hamming_distance(*hashA, *hashB); return res; }
float hamming_distance_cb(MVPDP *pointA, MVPDP *pointB) { if (!pointA || !pointB || pointA->datalen != pointB->datalen) { return -1.0f; } uint64_t a = *((uint64_t*)pointA->data); uint64_t b = *((uint64_t*)pointB->data); int res = ph_hamming_distance(a, b); return (float)res; }
JNIEXPORT jdouble JNICALL Java_org_phash_pHash_imageDistance (JNIEnv *e, jclass cl, jobject hash1, jobject hash2) { if(e->IsInstanceOf(hash1, dctImClass) && e->IsInstanceOf(hash2, dctImClass)) { ulong64 imHash, imHash2; imHash = (ulong64)e->GetLongField(hash1, dctImHash_hash); imHash2 = (ulong64)e->GetLongField(hash2, dctImHash_hash); return ph_hamming_distance(imHash, imHash2); } else if(e->IsInstanceOf(hash1, mhImClass) && e->IsInstanceOf(hash2, mhImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hash1, mhImHash_hash); jbyteArray h2 = (jbyteArray)e->GetObjectField(hash2, mhImHash_hash); int N = e->GetArrayLength(h); int N2 = e->GetArrayLength(h2); jbyte *hash = e->GetByteArrayElements(h, NULL); jbyte *hash2 = e->GetByteArrayElements(h2, NULL); double hd = ph_hammingdistance2((uint8_t*)hash, N, (uint8_t*)hash2, N2); e->ReleaseByteArrayElements(h, hash, 0); e->ReleaseByteArrayElements(h2, hash2, 0); return hd; } else if(e->IsInstanceOf(hash1, radialImClass) && e->IsInstanceOf(hash2, radialImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hash1, radialImHash_hash); jbyteArray h2 = (jbyteArray)e->GetObjectField(hash2, radialImHash_hash); int N = e->GetArrayLength(h); int N2 = e->GetArrayLength(h2); jbyte *hash = e->GetByteArrayElements(h, NULL); jbyte *hash2 = e->GetByteArrayElements(h2, NULL); Digest x = {NULL,(uint8_t*)hash,N}, y = {NULL,(uint8_t*)hash2,N2}; double pcc = -1; ph_crosscorr(x,y,pcc); e->ReleaseByteArrayElements(h, hash, 0); e->ReleaseByteArrayElements(h2, hash2, 0); return pcc; } return -1; }
SQLITE_EXTENSION_INIT1 static void hamming_distance(sqlite3_context * ctx, int agc, sqlite3_value **argv) { sqlite3_int64 hashes[4]; ulong64 left, right; int i, result; for(i = 0; i < 4; i++) { if (SQLITE_INTEGER == sqlite3_value_type(argv[i])) { hashes[i] = sqlite3_value_int64(argv[i]); } else { hashes[i] = 0; } } left = (hashes[0] << 32) + hashes[1]; right = (hashes[2] << 32) + hashes[3]; result = ph_hamming_distance(left, right); sqlite3_result_int(ctx, result); }
float distancefunc(DP *pa, DP *pb){ nb_calcs++; float d = ph_hamming_distance(*((ulong64*)pa->hash),*((ulong64*)pb->hash)); return d; }