基于CSV行生成唯一的非随机ID?

时间:2012-08-05 06:11:49

标签: php csv uniqueidentifier

我的格式为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 个答案:

答案 0 :(得分:1)

如何将唯一ID添加为字段?

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

输出$ csv_new作为新的csv文件..

很脏,但它可能适合你。

答案 1 :(得分: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);

答案 2 :(得分:1)

如果您需要以后只能从该行的文本重建ID,则需要hash algorithm。但它不一定是MD5。

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

根据Jeff的文章,MD5已经只是最快的哈希算法(每秒有10-20,000,000个哈希值),但NTLM的速度似乎快了两倍。

答案 3 :(得分:1)

我明白你在说什么,但我没有看到一点。创建在数据库中自动递增的唯一ID将是最佳路径。第二条路线将在csv中创建类似于cell = a1 + 1并将其拖动到整行。在你的PHP你。读取文件并添加诸如date(ymd)。$ id之类的内容然后将其写回文件。虽然这看起来很愚蠢,但数据库路线最好。请记住pci合规性并始终加密数据。 我稍后会发布代码。我此时不在PC上。

已经很长时间了,但是我发现了一种类似于这种情况,我需要阻止在数据库中创建一行,我创建了另一个名为de_dup的列,它被设置为唯一的。然后,我创建使用日期的每一行('ymd')。md5(implode($ selected_csv_values));这将阻止客户在任何特定日期创建订单,除非特定信息不同,即:firstname,lastname,creditcardnum,billingaddress。