2013-07-22 1 views
1

Recherche d'une chaîne à fonction de hachage en nombre entier avec des valeurs comprises dans la plage de mysql bigint unsigned type de données (0 <= n <= 18446744073709551615). La conversion de md5/sha1 en entier avec la base de 16 ne correspond pas à cette exigence.Fonction de hachage Integer 128 bits

+0

De quel type de propriétés votre fonction de hachage a-t-elle besoin? Devrait-il être cryptographique? A-t-il besoin d'être rapide? Je m'attendrais à ce qu'il soit cohérent entre les différentes exécutions d'un programme. – user2357112

+0

@ user2357112 Aucune cryptographie. La valeur va être utilisée comme valeur de clé entière pour les chaînes. L'exigence de faibles collisions est un must. –

+1

Essentiellement, vous voulez un hachage 64 bits. Wikipedia en a quelques-uns qui sont répertoriés comme 64 bits à la fois cryptographiques et non cryptographiques, y compris RIPEMD-64, Siphash, elf64, etc. Pourquoi une telle taille de hachage limitée? –

Répondre

0

Java utilise un rolling hash qui devrait fonctionner pour vous

De java.lang.String:

public int hashCode() { 
    int h = hash; 
    if (h == 0 && count > 0) { 
     int off = offset; 
     char val[] = value; 
     int len = count; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 

L'idée est de calculer le hachage comme:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

Pour faire face à débordement, vous pouvez ajouter une étape où le hachage est vérifié par rapport à 18446744073709551615 et s'il est plus grand, prendre le mod du hachage et 18446744073709551615.