1

我有一个格式为 CSV:

Bill,Smith,123 Main Street,Smalltown,NY,5551234567
Jane,Smith,123 Main Street,Smalltown,NY,5551234567
John,Doe,85 Main Street,Smalltown,NY,5558901234
John,Doe,100 Foo Street,Bigtown,CA,5556789012

换句话说,没有一个领域是独一无二的。两个人可以有相同的名字,两个人可以有相同的电话,等等,但是当您考虑所有字段时,每行本身都是唯一的。

我需要为每一行生成一个唯一的 ID,但它不能是随机的。而且我需要能够在将来的某个时间获取一行 CSV,并找出那个人的唯一 ID 是什么,而无需查询数据库。

在 PHP 中执行此操作的最快方法是什么?我需要对数百万行执行此操作,因此md5()为每一行生成整个字符串并不实际。我应该使用更好的功能吗?

4

4 回答 4

1

如果您以后需要能够仅从该行的文本重建 ID,您需要一个哈希算法。不过,它不一定是 MD5。

“数百万个 ID”对于现代 CPU(或者,尤其是 GPU。请参阅 Jeff 最近关于Speed Hashing的博客)来说并不是真正的问题,因此您可能希望使用与 PHP 不同的语言进行散列。我能看到的唯一问题是碰撞。您需要确定您生成的散列确实是唯一的,其可能性取决于条目的数量、使用的算法和散列的长度。

根据 Jeff 的文章,MD5 已经是目前最快的哈希算法(每秒 10-200 亿次哈希),但NTLM似乎快了一倍。

于 2012-08-05T06:25:17.167 回答
1

将唯一 ID 添加为字段怎么样?

$csv=file($file);
$i=0;
$csv_new=array();
foreach ($file as $val){
    $csv_new[]=$i.",".$val;
    $i++;
}

并将 $csv_new 输出为新的 csv 文件。

肮脏,但它可能对你有用。

于 2012-08-05T06:17:33.707 回答
1

为什么不只是

CREATE TABLE data (
    first VARCHAR(50),
    last  VARCHAR(50),
    addr  VARCHAR(50),
    city  VARCHAR(50),
    state VARCHAR(50),
    phone VARCHAR(50),
    id    INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

LOAD DATA [LOCAL] INFILE 'file.csv'
INTO TABLE data
(first,last,addr,city,state,phone);
于 2012-08-05T06:20:31.723 回答
1

我明白你在说什么,但我不明白这一点。在数据库中创建一个自动递增的唯一 id 将是最佳途径。第二条路线将在 csv 中创建类似于 cell=a1+1 的内容并将其拖到整行中。在 php 中,你可以。读取文件并添加诸如 date(ymd).$id 之类的内容,然后将其写回文件。同样,尽管这样做似乎很愚蠢,并且数据库路由是最好的。请记住 pci 合规性并始终加密数据。我稍后会发布代码。我现在不在电脑前。

已经很长时间了,但是我发现了一种类似这样的情况,我需要防止在数据库中创建行,我创建了另一个名为 de_dup 的列,它被设置为唯一的。然后,我为创建时使用的每一行 date('ymd').md5(implode($selected_csv_values)); 这将阻止客户在任何给定日期创建订单,除非特定信息不同,即:名字、姓氏、信用卡号码、帐单地址。

于 2016-05-28T21:53:52.903 回答