Une Chaîne de fonction de hachage
Je veux obtenir une unique représentation numérique d'une Chaîne de caractères. Je sais qu'il ya beaucoup de façons de le faire, ma question est qui pensez-vous est le meilleur? Je ne veux pas avoir des nombres négatifs - de sorte que le hashcode() en java n'est pas très bon, bien que je puisse le remplacer ... mais je préfère ne pas depuis que je ne suis pas si confiant et ne veux pas casser accidentellement quelque chose.
Mes Chaînes sont tous sémantique web URI. La raison de la représentation numérique, c'est que lorsque j'affiche les données pour une URI sur une page j'ai besoin de quelque chose pour passer dans la Chaîne de requête ou de les mettre dans les divers champs dans mon javascript. L'URI lui-même est trop lourd et est de mauvaise qualité, quand vous avez un URI comme une valeur dans une URI.
Fondamentalement, je veux avoir une classe appelée Resource
qui ressemblera à ceci
Resource{
int id;
String uri;
String value; //this is the label or human readable name
//.... other code/getters/setters here
public int getId(){
return id = stringToIntFunction();
}
private int stringToIntFunction(String uri){
//do magic here
}
}
Pouvez-vous la suggestion d'une fonction qui permettrait de faire cela que si:
- Il fallait être deux, c'est vous pouvez également récupérer la chaîne d'origine à partir de la valeur numérique
- Il n'a pas à être deux façon
Aussi y at-il d'autres questions qui sont importantes que je ne suis pas pris en compte?
OriginalL'auteur Ankur | 2011-07-10
Vous devez vous connecter pour publier un commentaire.
Si vous voulez qu'il soit réversible, vous êtes en difficulté. Les hachages sont conçu à sens unique.
En particulier, étant donné qu'une
int
a 32 bits d'information, et unchar
a 16 bits d'information, nécessitant la réversibilité signifie que vous ne pouvez avoir les chaînes de zéro, un ou deux personnages (et encore, ce n'est en supposant que vous êtes heureux de coder "" "\0\0" ou quelque chose de similaire). C'est en supposant que vous n'avez pas de stockage, bien sûr. Si vous pouvez utiliser le stockage, puis il suffit de stocker des numéros de façon séquentielle... quelque chose comme:Ici
storage.put()
augmentera d'un compteur interne, de stocker l'URI comme étant associée à cette valeur de compteur, et de le retourner. Ma conjecture est que ce n'est pas ce que vous êtes après.Fondamentalement, pour effectuer un chiffrement réversible, j'utilise un cryptage standard de la bibliothèque ayant converti la chaîne dans un format binaire (par exemple l'utilisation de l'UTF-8). Je m'attends à ce que le résultat soit un
byte[]
.Si il n'est pas être réversible, je considère juste de prendre la valeur absolue de la normale
hashCode()
résultat (mais la cartographieInteger.MIN_VALUE
à quelque chose de spécifique, comme sa valeur absolue ne peut pas être représenté comme uneint
).Ne vous inquiétez pas à propos de répondre que, pour la manière d'une situation, il y a beaucoup de matériel là-bas (et sur)
La valeur absolue de l'Entier.MIN_VALUE est 2,147,483,648. Toutefois, le plus grand nombre positif Entier peut représenter 2 147 483 647. Si vous avez à faire assurez-vous de ne pas appeler les Mathématiques.abs Entier.MIN_VALUE et, au lieu de la traiter différemment.
Oui, idéalement, je ne veux pas de recherche d'un magasin global de l'Ids. À l'aide du chiffrement algos semble faire sens.
Mais le problème est que les Uri sont trop gros, non? Le chiffrement ne va pas vous aider.
OriginalL'auteur Jon Skeet
Les hachages sont d'une seule façon (qui fait partie de la raison pour laquelle ils ont une longueur fixe quelle que soit la taille de saisie). Si vous avez besoin de deux façon, vous êtes à la recherche de quelque chose comme de l'encodage Base64.
Pourquoi ne pouvez-vous pas avoir des nombres négatifs? Où l'Uri venir? Sont-ils dans une base de données? Pourquoi ne pas utiliser la Base de données ID de Clé? Si elles ne sont pas dans une base de données, vous pouvez générer pour l'utilisateur étant donné un ensemble de variables/paramètres? (Si la chaîne de requête ne contient que des choses comme les foo=1&bar=deux et vous générer l'URL sur le Serveur ou JavaScript côté)
Aucune chance de résoudre ce problème par le biais de la mise en cache? Essentiellement, ce que Jon l'indique, un mondial de table de hachage.
Oui en quelque sorte. Ce que je pense est, 1) calculer certains de la valeur de hachage, 2) de magasin dans l'ordre numérique 3) afin de regarder à travers ce tableau, puis ajouter A, B, C, etc. pour la deuxième, troisième, quatrième ... les instances de hachage. Je devrais l'avoir mentionné, il n'est pas strictement nécessaire d'être un int (bien que ce serait bien). Juste quelque chose de compact.
Mais ma solution serait confronté à certains problèmes, si ce n'est pas grand.
OriginalL'auteur Michael Stum
Compte tenu de toutes les remars fait ci-dessus (fonction de hachage est une façon), je pencherais pour 2 solutions possibles:
OriginalL'auteur Vincent Mimoun-Prat
"Représentation Unique" implique que le Java chaîne fournie.hashcode serait inutile, vous allez bientôt venir à travers deux URIs qui a partagé le même hashcode.
Tout les deux sens schéma est le résultat d'une lourde chaîne, sauf si vous stockez les Uri dans une base de données et l'utilisation de l'ID de l'enregistrement en tant que votre identifiant unique.
Autant que d'une façon va - un hachage MD5 serait nettement plus unique (mais pas unique) que le simple hashcode - mais peut-être frôlé "lourd", selon la définition de!
OriginalL'auteur Will A
Q1: Si vous voulez récupérer la chaîne de caractères à partir de la série, alors vous pourriez utiliser:
1a: un chiffrement de la chaîne, qui va être de la même taille, ou plus, à moins que vous zip de la chaîne. Cela permettra de donner un tableau de hasard à la recherche d'octets, qui pourrait être affichée en Base 64.
1b: une base de données, ou une carte, et le nombre est l'indice de la chaîne de la carte/de la base de données.
T2: La chaîne ne doit pas être recouvrable.
Diverses idées sont ici possibles. Vous pouvez afficher la valeur de hachage en hexadécimal ou en Base 64 pour éviter les signes négatifs. Les seuls caractères non alphanumériques en Base-64 '+', '/' et '='. Pour un presque de hachage unique, vous aurez besoin de quelque chose de chiffrement taille, MD5 (128 bits), SHA-1 (160 bits) ou SHA-2 (256 ou 512 bits).
Un hachage MD5 ressemble "d131dd02c5e6eec4693d9a0698aff95c" en hexadécimal; plus grande est la valeur de hachage le moins de chances d'une collision.
rossum
OriginalL'auteur rossum