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


Generating unique non-random id based on CSV row?

我有一个格式为的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()实际上并不实用。有没有更好的功能我应该使用?

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

"数以百万计的ID"对现代CPU(尤其是GPU)来说并不是一个真正的问题。请参阅Jeff最近关于Speed Hashing的博客),所以你可能想用与PHP不同的语言进行哈希。我能看到的唯一问题是碰撞。您需要确保生成的哈希确实是唯一的,这取决于条目的数量、使用的算法和哈希的长度。

根据Jeff的文章,MD5已经是目前最快的哈希算法之一(每秒有10-20万个哈希),但NTLM似乎是它的两倍。

为什么不只是

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);

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

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

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

脏,但它可能对你有用。

我理解你的意思,但我看不出有什么意义。创建一个在数据库中自动递增的唯一id将是最佳途径。第二条路线是在csv中创建类似cell=a1+1的内容,并将其拖到整行。在php中,你可以阅读文件并在前面加上日期(ymd)之类的内容$id然后将其写回文件。尽管这样做似乎很愚蠢,但数据库路由将是最好的。只需记住符合pci,并始终加密数据。我稍后会发布代码。我现在不在电脑上。

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