2010-10-19 7 views
0

Comment puis-je produire une clé de valeur unique à associer à mon nom de champ _rec_key_? Je produis un fichier de données. Je cherchais à utiliser une valeur MD5 comme clé ou toute autre suggestion que vous avez pour faire en sorte que cela soit unique. Je ne suis pas familier avec la façon d'extraire cette valeur.Comment puis-je créer une valeur unique en Perl pour chaque enregistrement que je récupère depuis MySQL?

Le format du fichier doit ressembler à ceci:

__rec_key__^amd5val^ex_id^a1^einum^a2609^euser^aJoe^e^d 
__rec_key__^amd5val^ex_id^a2^einum^a2609^euser^aBob^e^d 

Fondamentalement, enfermant la valeur avec ^a et ^e et se terminant le rec avec ^d

Mon échantillon table de données:

+------+------+------+ 
| x_id | inum | user | 
+------+------+------+ 
| 1 | 2608 | Joe | 
| 2 | 2609 | Bob | 
+------+------+------+ 

Mon code jusqu'ici est ce ... qui produit juste ma sortie, sans la valeur unique md5. je besoin de la valeur à être jumelé avec _rec_key_

my $data = ''; 
my $dbh = DBI->connect("DBI:mysql:test:localhost:3306"); 
my $sth = $dbh->prepare("select x_id, inum, user from mytest"); 
$sth->execute(); 
while (my($x_id, $inum, $user) = $sth->fetchrow_array()) { 
$data = $data. "__record_key__^a$x_id^e^a$inum^e^a$user^e^d"; 
} 
$sth->finish; 
$dbh->disconnect; 
print $data; 

Répondre

3

Il est difficile de comprendre ce que vous essayez de faire, donc je ne peux pas dire si vous utilisez un md5 est approprié ici, mais vous pouvez les créer avec la distribution Digest::MD5 de CPAN:

use Digest::MD5 qw(md5_hex); 

my $data = 'some arbitrary data'; 
my $digest = md5_hex($data); 
print $digest, "\n"; 

impressions:

a9959dc27c0bac23be48686ceaa1683c

+0

pour cette tâche particulière, oui j'ai besoin d'une valeur de type md5. merci, je vais vérifier cette distribution. – jdamae

+0

ou Digest :: SHA1 d'ailleurs http://search.cpan.org/~gaas/Digest-SHA1-2.13/SHA1.pm, ou plus flexible utilisez l'objet Digest et initialisez avec votre algo choisi – dvhh

+0

cela fonctionne pour moi maintenant, il répond à ma question de base pour créer une valeur MD5. – jdamae

1

Je suis d'accord avec Ether. Vous pouvez également utiliser la fonction MD5() dans la base de données. Cependant, si votre x_id n'est pas unique, vous devez utiliser une autre valeur pour créer le MD5. Un MD5 doit commencer avec des données uniques.

Et si votre x_id est unique, alors pourquoi avez-vous besoin d'un MD5?

1

Jetez un oeil au module Perl Data :: UUID?

1

Si vous cherchez à coller avec votre système, votre boucle while est tout faux:

while (my($x_id, $inum, $user) = $sth->fetchrow_array()) { 
    $data = $data. "__record_key__^a$x_id^e^a$inum^e^a$user^e^d"; 
} 

Cela va construire une très longue chaîne. Vous voulez en fait une chaîne par utilisateur:

while (my($x_id, $inum, $user) = $sth->fetchrow_array()) { 
    my $data = "__record_key__^a${x_id}^e^a${inum}^e^a${user}^e^d"; 
    ... 
} 

J'ai aussi mis entre parenthèses autour de vos noms de variables pour plus de clarté (à savoir ${user}^e^d au lieu de $user^e^d).

0

Quel est ce numéro d'enregistrement? Pourquoi a-t-il besoin d'être unique? Est-ce que x_id est unique? Y a-t-il un format, une plage ou d'autres exigences sur la valeur du numéro d'enregistrement? Est-ce que la valeur signifie quelque chose ou est-ce juste une valeur unique?

Dans ces cas, j'aime me débarrasser des cas particuliers. Si j'ai besoin d'une chaîne unique associée à chaque enregistrement, je laisse la base de données donner à chaque enregistrement une chaîne unique.Dans la terre de base de données, chaque enregistrement doit avoir un primary or unique key:

CREATE TABLE (
     pk INT AUTO_INCREMENT PRIMARY KEY, 
     ... 
     ); 

Lorsque vous insérez des données dans cette table, MySQL peut choisir la valeur pk pour vous.

Une fois que la valeur dont vous avez besoin est stockée avec les autres valeurs, la viande de votre programme est alors:

my $sth = $dbh->prepare("select pk, x_id, inum, user from mytest"); 
$sth->execute(); 

while (my($pk, $x_id, $inum, $user) = $sth->fetchrow_array()) { 
    $data = $data. "$pk^a$x_id^e^a$inum^e^a$user^e^d"; 
    } 

Vous avez pas beaucoup parlé des contraintes de votre problème cependant.

+0

Je considère votre suggestion aussi. Semble assez facile à mettre en œuvre. Merci. – jdamae

2

Pourquoi pas UUID() in MySQL? Aussi réplication sûre.

+0

bonne suggestion, merci pour votre conseil. Je regarde cela aussi. – jdamae

Questions connexes