我的格式为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()
每行的整个字符串并不实际。我应该使用更好的功能吗?
答案 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。