如何生成与我的_rec_key_
字段名称配对的唯一值键?我正在生成一个数据文件。我正在考虑使用MD5值作为我的密钥或任何其他建议,以确保这是唯一的。我不熟悉如何提取这个值。
文件的格式应如下所示:
__rec_key__^amd5val^ex_id^a1^einum^a2609^euser^aJoe^e^d
__rec_key__^amd5val^ex_id^a2^einum^a2609^euser^aBob^e^d
基本上,将^a
和^e
括起来并以^d
我的样本数据表:
+------+------+------+
| x_id | inum | user |
+------+------+------+
| 1 | 2608 | Joe |
| 2 | 2609 | Bob |
+------+------+------+
到目前为止我的代码就是这个...它只生成我的输出,没有md5唯一值。
我需要将值与_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;
答案 0 :(得分:3)
很难理解你想要做什么,所以我不能说在这里使用md5是否合适,但你可以用CPAN的Digest::MD5发行版来创建它们:
use Digest::MD5 qw(md5_hex);
my $data = 'some arbitrary data';
my $digest = md5_hex($data);
print $digest, "\n";
打印:
a9959dc27c0bac23be48686ceaa1683c
答案 1 :(得分:2)
为什么不UUID() in MySQL?复制安全。
答案 2 :(得分:1)
我同意以太。您还可以在数据库中使用MD5()
函数。但是,如果您的x_id
不是唯一的,那么您必须使用其他一些值来制作MD5。 MD5需要从唯一数据开始。
如果您的x_id
是唯一的,那么为什么还需要MD5?
答案 3 :(得分:1)
看一下Data :: UUID perl模块?
答案 4 :(得分:1)
如果您希望坚持使用您的方案,那么while
循环就错了:
while (my($x_id, $inum, $user) = $sth->fetchrow_array() ) {
$data = $data. "__record_key__^a$x_id^e^a$inum^e^a$user^e^d";
}
这将构建一个非常长的字符串。实际上你想要每个用户一个字符串:
while (my($x_id, $inum, $user) = $sth->fetchrow_array() ) {
my $data = "__record_key__^a${x_id}^e^a${inum}^e^a${user}^e^d";
...
}
为了清晰起见,我还在变量名称周围添加了括号(例如${user}^e^d
而不是$user^e^d
)。
答案 5 :(得分:0)
这个记录号是多少?为什么它需要独一无二? x_id
是唯一的吗?记录号值是否有任何格式,范围或其他要求?这个值是什么意思,还是只是一个独特的价值?
在这些情况下,我喜欢摆脱特殊情况。如果我需要一个与每条记录关联的唯一字符串,我让数据库为每条记录提供一个唯一的字符串。在数据库土地中,每条记录都应该有一个primary or unique key:
CREATE TABLE (
pk INT AUTO_INCREMENT PRIMARY KEY,
...
);
当您将数据插入该表时,MySQL可以为您选择pk
的值。
一旦您需要的值与其他值一起存储,那么您的程序就是:
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";
}
尽管如此,你对问题的限制并没有多说。