使用Oracle标准_散列,在JAVA中复制散列
我在Oracle中使用标准的_HASH('input','SHA256')函数,用它们的相对哈希值填充记录 可通过连接到Oracle进行以下操作来复制:使用Oracle标准_散列,在JAVA中复制散列,java,oracle,hash,compatibility,Java,Oracle,Hash,Compatibility,我在Oracle中使用标准的_HASH('input','SHA256')函数,用它们的相对哈希值填充记录 可通过连接到Oracle进行以下操作来复制: select STANDARD_HASH('1234','SHA256') from dual 表X 第1列,第1列-散列 1234,sha512hashresult 1234,sha512hashresult 1234,sha512hashresult 1234,sha512hashresult 现在问题是什么在JAVA中我必须做什么才
select STANDARD_HASH('1234','SHA256')
from dual
表X
第1列,第1列-散列
1234,sha512hashresult
1234,sha512hashresult
1234,sha512hashresult
1234,sha512hashresult
现在问题是什么在JAVA中我必须做什么才能准确地再现Oracle中标准_哈希生成的哈希值?有人有这方面的经验吗
注;由于某些原因,推荐的Oracle哈希函数没有种子。是否有人知道默认种子或如何解决此问题
背景:我想做什么?使用Oracle默认工具填充Oracle中的表,并使用Java程序接收输入,对其进行散列并在表中选择正确的记录
我不想要的;有人告诉我如何以不同的方式实现它,我需要的正是这种方式,否则会节省您的时间如果您对Java方面的使用感到满意,下面的代码应该与Oracle的标准\u哈希
产生相同的结果:
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
...
String input = "1234";
String hash = Hashing.sha256()
.hashString(input, Charsets.UTF_8)
.toString()
// toString() returns the HEX value as lower-case, whereas
// Oracle's STANDARD_HASH returns an upper-cased string
.toUpperCase();
System.out.println(hash);
这将打印出03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4
,这与您在Oracle中使用的相同
select STANDARD_HASH('1234','SHA256') from dual;
可以使用标准库执行此操作。与算法SHA-256一起使用
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import javax.xml.bind.DatatypeConverter;
...
String input = "1234";
byte[] hashBytes = MessageDigest.getInstance("SHA-256")
.digest(input.getBytes(StandardCharsets.UTF_8));
String hash = DatatypeConverter.printHexBinary(hashBytes);
System.out.println(hash);
这将打印03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4
,与STANDARD_HASH
返回的字符串相同
如中所述,有更快的方法将字节[]
转换为十六进制字符串,但DatatypeConverter.printHexBinary()
具有作为标准库一部分的优点,对于大多数用例来说应该是不错的。而不是尝试在Java中复制函数,您为什么不使用服务从Java调用它(让它在DB端执行),非常感谢您的支持