2010-10-21 10 views
3

Avoir un md5 comme:Attribuez un numéro (entre 1 et 9) à un md5

md5("test") = "098f6bcd4621d373cade4e832627b4f6" 

Comment puis-je écrire une fonction pour retourner un nombre compris entre 1 et 9 chaque fois que je passe le md5 à cela? Le numéro doit toujours être le même, c'est-à-dire que myfunc ("098f6bcd4621d373cade4e832627b4f6") doit toujours renvoyer le même nombre. Merci pour votre aide.

+1

Je ne comprends pas votre exigence. Pouvez-vous faire un exemple? –

+2

Pourquoi avez-vous besoin de ça? – jwueller

Répondre

5

C'est bien surpuissant, et la suggestion de retour des plus à gauche chiffres est le meilleur ...

function myfunc($md5) { 
    $total = 0; 
    foreach (str_split($md5) as $char) $total += ord($char); 
    return $total % 9 + 1; 
} 

echo myfunc("098f6bcd4621d373cade4e832627b4f6"); 

De cette façon, vous pouvez facilement modifier la plage des valeurs de retour qui vous intéresse en modifiant le retour déclaration.

Ou, une version plus compacte:

function myfunc2($md5) { 
    return array_sum(array_map("ord", str_split($md5))) % 9 + 1; 
} 

Vous pouvez même passer le min et max comme args:

function myfunc2($md5, $min = 1, $max = 9) { 
    return array_sum(array_map("ord", str_split($md5))) % $max + $min; 
} 

myfunc2("098f6bcd4621d373cade4e832627b4f6", 10, 20); 
+0

+1 pour rafraîchir mon esprit - Je ne pouvais pas trouver la fonction pour convertir de grands entiers d'une base à une autre. –

+0

@Alvaro Votre accueil, je pense. –

+0

Merci beaucoup! Je vais utiliser la version compacte. À votre santé. – Tony

2

Renvoie le chiffre le plus à gauche (en 1..9 bien sûr) dans le hachage considéré comme une chaîne.

Ou ai-je manqué le point?

4

Façon la plus simple: trouver le premier numéro en md5 et le retourner :) Vous pouvez le faire avec regexp facile. Bien sûr, n'oubliez pas d'avoir une valeur de retour sûre si aucun numéro n'a été trouvé (mais cela n'arrivera presque jamais).

+1

Plus précisément, il se produira environ 1 à 42 milliards de fois. –

3

Retour 1 tout le temps. Rencontre les spécifications! Plus sérieusement, qu'avez-vous besoin de ce nombre pour représenter?

+1

Arrêtez ça! Cela devient plutôt stupide. –

1

Voici une solution:

return substr(base_convert($md5, 16, 9), -1) + 1;

Cette est ce que vous voulez probablement bien que vous ne le disiez pas.

2

Vous voulez essentiellement une fonction de hachage de votre fonction de hachage. Ce serait un code psedo:

int hashhash(string hash) 
    return (hash[0] % 9) + 1;