首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要给mysql的每一行分配一个随机但唯一的ID,如果该行包含相同的值,table.The ID应该是相同的。

问我需要给mysql的每一行分配一个随机但唯一的ID,如果该行包含相同的值,table.The ID应该是相同的。
EN

Stack Overflow用户
提问于 2013-03-05 13:15:41
回答 4查看 239关注 0票数 4

我需要给Mysql中的每一行分配一个随机但唯一的ID,如果该行包含相同的值,table.The ID应该是相同的。

也就是说,如果第一行包含hi,hello,bye,第二行包含same,hello,bye,第三行包含the,hello,bye,那么第一行和第三行应该生成相同的ID,而第二行应该生成不同的ID。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-05 13:19:06

代码语言:javascript
复制
SELECT CRC32(CONCAT(column1, column2, column3)) FROM MyTable.

从技术上讲,CRC32不是随机的(但什么是随机的呢?) --而且它产生冲突的可能性很小(不同的值映射到同一个整数)。但这只是个开始。

票数 1
EN

Stack Overflow用户

发布于 2013-03-05 13:31:23

MD5散列可以工作。下面是需要更新的代码片段和快速/脏代码,但证明了这一概念。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-03-05 14:05:27

如果你真的想证明你没有冲突,所有的事情都归结为连接所有的字段,字段中不包含分隔符。当然,这通常会非常漫长和繁琐的工作。

每个人通常做的是:将该字符串放入一个Hash函数中。虽然理论上不是唯一的,但如果给出一个合适的Hashfunction并具有足够大的结果,in应该能够找到一个在人类生存期间不太可能产生冲突的Hashfunction。例如,git使用这样的散列(sha1),Linus Torvalds写了关于chance of a accidental collision的

首先,让我提醒大家,这种无意的碰撞是非常不可能的,所以在整个宇宙的历史中,我们很可能永远也看不到它。

。

另一件不同的事情是不那么偶然的碰撞。首先,你应该确保你开始的字符串对于不同的列是不同的。这意味着:

  • 确保包含所有列
  • 确保列由列本身未包含的内容分隔。如有必要,请使用转义。例如,如果您只是连接两列,则值'abc‘+ 'def’将得到与'a‘+ 'bcdef'

相同的结果

如果你必须担心有针对性的攻击,即有人实际上试图用相同的哈希创建条目,你最好的选择是使用密码哈希,可能用于密码哈希,这通常被设计为很慢,以防止暴力破解攻击。当然,这可能会与大多数应用程序尽可能快的要求相冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15216345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档