我需要给Mysql中的每一行分配一个随机但唯一的ID,如果该行包含相同的值,table.The ID应该是相同的。
也就是说,如果第一行包含hi,hello,bye,第二行包含same,hello,bye,第三行包含the,hello,bye,那么第一行和第三行应该生成相同的ID,而第二行应该生成不同的ID。
提前谢谢。
发布于 2013-03-05 13:19:06
SELECT CRC32(CONCAT(column1, column2, column3)) FROM MyTable.从技术上讲,CRC32不是随机的(但什么是随机的呢?) --而且它产生冲突的可能性很小(不同的值映射到同一个整数)。但这只是个开始。
发布于 2013-03-05 13:31:23
MD5散列可以工作。下面是需要更新的代码片段和快速/脏代码,但证明了这一概念。
System.out.println("row1=" + test1 + ":" + tst1.getHash(test1));
System.out.println("row2=" + test2 + ":" + tst1.getHash(test2));
System.out.println("row3=" + test3 + ":" + tst1.getHash(test3));
private String getHash(String inputStr){
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(inputStr.getBytes());
byte byteData[] = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
row1=hi,hello,bye:cfe40e96aa052a484208c2aefb6f39bb
row2=gg,hello,bye:f652785f0e214507e6aea44ecd3ffb7a
row3=hi,hello,bye:cfe40e96aa052a484208c2aefb6f39bb发布于 2013-03-05 14:05:27
如果你真的想证明你没有冲突,所有的事情都归结为连接所有的字段,字段中不包含分隔符。当然,这通常会非常漫长和繁琐的工作。
每个人通常做的是:将该字符串放入一个Hash函数中。虽然理论上不是唯一的,但如果给出一个合适的Hashfunction并具有足够大的结果,in应该能够找到一个在人类生存期间不太可能产生冲突的Hashfunction。例如,git使用这样的散列(sha1),Linus Torvalds写了关于chance of a accidental collision的
首先,让我提醒大家,这种无意的碰撞是非常不可能的,所以在整个宇宙的历史中,我们很可能永远也看不到它。
。
另一件不同的事情是不那么偶然的碰撞。首先,你应该确保你开始的字符串对于不同的列是不同的。这意味着:
相同的结果
如果你必须担心有针对性的攻击,即有人实际上试图用相同的哈希创建条目,你最好的选择是使用密码哈希,可能用于密码哈希,这通常被设计为很慢,以防止暴力破解攻击。当然,这可能会与大多数应用程序尽可能快的要求相冲突。
https://stackoverflow.com/questions/15216345
复制相似问题