在新机器上安装jenkins后,安装插件报如下错误

  1. sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  2. at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
  3. at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
  4. at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
  5. at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
  6. Caused: sun.security.validator.ValidatorException: PKIX path building failed
  7. at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
  8. at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
  9. at sun.security.validator.Validator.validate(Validator.java:260)
  10. at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
  11. at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
  12. at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
  13. at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
  14. Caused: javax.net.ssl.SSLHandshakeException
  15. at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
  16. at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
  17. at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
  18. at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
  19. at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
  20. at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
  21. at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
  22. at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
  23. at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
  24. at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
  25. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
  26. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
  27. at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
  28. at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
  29. at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513)
  30. at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
  31. at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
  32. at hudson.model.DownloadService.loadJSON(DownloadService.java:167)
  33. at hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:190)
  34. at hudson.PluginManager.doCheckUpdatesServer(PluginManager.java:1633)
  35. at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
  36. at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)
  37. at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:52)
  38. at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
  39. at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)
  40. at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)
  41. at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)
  42. at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
  43. at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
  44. at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
  45. at org.kohsuke.stapler.MetaClass$2.doDispatch(MetaClass.java:186)
  46. at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
  47. at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
  48. at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
  49. at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
  50. at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
  51. at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
  52. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  53. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  54. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
  55. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  56. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  57. at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:135)
  58. at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:138)
  59. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  60. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  61. at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:85)
  62. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  63. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  64. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
  65. at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
  66. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  67. at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
  68. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  69. at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
  70. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  71. at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
  72. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  73. at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
  74. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  75. at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)
  76. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  77. at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
  78. at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
  79. at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
  80. at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
  81. at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
  82. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  83. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  84. at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
  85. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  86. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  87. at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
  88. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  89. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  90. at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
  91. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  92. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  93. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
  94. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  95. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:619)
  96. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
  97. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
  98. at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
  99. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  100. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
  101. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:417)
  102. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  103. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
  104. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
  105. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  106. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  107. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  108. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  109. at java.lang.Thread.run(Thread.java:745)

第一次遇到这种问题,百度了下找到如下解决方案

原方案地址:

http://blog.csdn.net/faye0412/article/details/6883879

简要摘录如下

新建一个java文件,代码如下

  1. /*
  2. * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * - Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  11. * - Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. *
  15. * - Neither the name of Sun Microsystems nor the names of its
  16. * contributors may be used to endorse or promote products derived
  17. * from this software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20. * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. */
  31.  
  32. import java.io.BufferedReader;
  33. import java.io.File;
  34. import java.io.FileInputStream;
  35. import java.io.FileOutputStream;
  36. import java.io.InputStream;
  37. import java.io.InputStreamReader;
  38. import java.io.OutputStream;
  39. import java.security.KeyStore;
  40. import java.security.MessageDigest;
  41. import java.security.cert.CertificateException;
  42. import java.security.cert.X509Certificate;
  43.  
  44. import javax.net.ssl.SSLContext;
  45. import javax.net.ssl.SSLException;
  46. import javax.net.ssl.SSLSocket;
  47. import javax.net.ssl.SSLSocketFactory;
  48. import javax.net.ssl.TrustManager;
  49. import javax.net.ssl.TrustManagerFactory;
  50. import javax.net.ssl.X509TrustManager;
  51.  
  52. public class InstallCert {
  53.  
  54. public static void main(String[] args) throws Exception {
  55. String host;
  56. int port;
  57. char[] passphrase;
  58. if ((args.length == 1) || (args.length == 2)) {
  59. String[] c = args[0].split(":");
  60. host = c[0];
  61. port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
  62. String p = (args.length == 1) ? "changeit" : args[1];
  63. passphrase = p.toCharArray();
  64. } else {
  65. System.out
  66. .println("Usage: java InstallCert <host>[:port] [passphrase]");
  67. return;
  68. }
  69.  
  70. File file = new File("jssecacerts");
  71. if (file.isFile() == false) {
  72. char SEP = File.separatorChar;
  73. File dir = new File(System.getProperty("java.home") + SEP + "lib"
  74. + SEP + "security");
  75. file = new File(dir, "jssecacerts");
  76. if (file.isFile() == false) {
  77. file = new File(dir, "cacerts");
  78. }
  79. }
  80. System.out.println("Loading KeyStore " + file + "...");
  81. InputStream in = new FileInputStream(file);
  82. KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  83. ks.load(in, passphrase);
  84. in.close();
  85.  
  86. SSLContext context = SSLContext.getInstance("TLS");
  87. TrustManagerFactory tmf = TrustManagerFactory
  88. .getInstance(TrustManagerFactory.getDefaultAlgorithm());
  89. tmf.init(ks);
  90. X509TrustManager defaultTrustManager = (X509TrustManager) tmf
  91. .getTrustManagers()[0];
  92. SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
  93. context.init(null, new TrustManager[] { tm }, null);
  94. SSLSocketFactory factory = context.getSocketFactory();
  95.  
  96. System.out
  97. .println("Opening connection to " + host + ":" + port + "...");
  98. SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
  99. socket.setSoTimeout(10000);
  100. try {
  101. System.out.println("Starting SSL handshake...");
  102. socket.startHandshake();
  103. socket.close();
  104. System.out.println();
  105. System.out.println("No errors, certificate is already trusted");
  106. } catch (SSLException e) {
  107. System.out.println();
  108. e.printStackTrace(System.out);
  109. }
  110.  
  111. X509Certificate[] chain = tm.chain;
  112. if (chain == null) {
  113. System.out.println("Could not obtain server certificate chain");
  114. return;
  115. }
  116.  
  117. BufferedReader reader = new BufferedReader(new InputStreamReader(
  118. System.in));
  119.  
  120. System.out.println();
  121. System.out.println("Server sent " + chain.length + " certificate(s):");
  122. System.out.println();
  123. MessageDigest sha1 = MessageDigest.getInstance("SHA1");
  124. MessageDigest md5 = MessageDigest.getInstance("MD5");
  125. for (int i = 0; i < chain.length; i++) {
  126. X509Certificate cert = chain[i];
  127. System.out.println(" " + (i + 1) + " Subject "
  128. + cert.getSubjectDN());
  129. System.out.println(" Issuer " + cert.getIssuerDN());
  130. sha1.update(cert.getEncoded());
  131. System.out.println(" sha1 " + toHexString(sha1.digest()));
  132. md5.update(cert.getEncoded());
  133. System.out.println(" md5 " + toHexString(md5.digest()));
  134. System.out.println();
  135. }
  136.  
  137. System.out
  138. .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
  139. String line = reader.readLine().trim();
  140. int k;
  141. try {
  142. k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
  143. } catch (NumberFormatException e) {
  144. System.out.println("KeyStore not changed");
  145. return;
  146. }
  147.  
  148. X509Certificate cert = chain[k];
  149. String alias = host + "-" + (k + 1);
  150. ks.setCertificateEntry(alias, cert);
  151.  
  152. OutputStream out = new FileOutputStream("jssecacerts");
  153. ks.store(out, passphrase);
  154. out.close();
  155.  
  156. System.out.println();
  157. System.out.println(cert);
  158. System.out.println();
  159. System.out
  160. .println("Added certificate to keystore 'jssecacerts' using alias '"
  161. + alias + "'");
  162. }
  163.  
  164. private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
  165.  
  166. private static String toHexString(byte[] bytes) {
  167. StringBuilder sb = new StringBuilder(bytes.length * 3);
  168. for (int b : bytes) {
  169. b &= 0xff;
  170. sb.append(HEXDIGITS[b >> 4]);
  171. sb.append(HEXDIGITS[b & 15]);
  172. sb.append(' ');
  173. }
  174. return sb.toString();
  175. }
  176.  
  177. private static class SavingTrustManager implements X509TrustManager {
  178.  
  179. private final X509TrustManager tm;
  180. private X509Certificate[] chain;
  181.  
  182. SavingTrustManager(X509TrustManager tm) {
  183. this.tm = tm;
  184. }
  185.  
  186. public X509Certificate[] getAcceptedIssuers() {
  187. throw new UnsupportedOperationException();
  188. }
  189.  
  190. public void checkClientTrusted(X509Certificate[] chain, String authType)
  191. throws CertificateException {
  192. throw new UnsupportedOperationException();
  193. }
  194.  
  195. public void checkServerTrusted(X509Certificate[] chain, String authType)
  196. throws CertificateException {
  197. this.chain = chain;
  198. tm.checkServerTrusted(chain, authType);
  199. }
  200. }
  201.  
  202. }

编译InstallCert.java,然后执行:java InstallCert updates.jenkins.io

将证书jssecacerts拷贝到$JAVA_HOME/jre/lib/security目录下,重启tomcat即可

Jenkis 无法下载插件问题解决的更多相关文章

  1. nginx做代理离线下载插件

    一.背景 被安装的服务器不能上网,无法下载插件,一个插件都还好,但是遇到插件依赖很强的需要几十个插件的依赖,这样就很麻烦. 二.环境 192.168.182.155     安装nginx     能 ...

  2. Jenkins系列之Jenkins配置常用工具和如何下载插件

    上一篇我们介绍了Jenkins的安装,这一篇我们介绍如何配置Jenkins的工具和如何下载插件. 首先我们先来看如何配置工具,这里的工具是指JDK.Ant.Maven.Git等. 1.点击系统管理,如 ...

  3. IDEA下载插件超时的原因

    setting中红框的对勾去掉就可以下载插件了

  4. jenkins 下载插件失败处理办法

    jenkins 下载插件失败,提示: java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp doe ...

  5. jenkins的代理设置,方便下载插件

    jenkins在下载插件的时候,总是网络不通,需要设置代理跨越长城 java.net.SocketTimeoutException: connect timed out Caused: java.ne ...

  6. jenkins下载插件无插件显示+离线下载插件方法

    1.打开Jenkins插件管理,可选插件为空,无法选择自己需要的插件进行下载 打开插件管理的“高级”选项,在升级站点填写 http://mirror.xmission.com/jenkins/upda ...

  7. VSCode安装go语言开发环境,go插件问题解决

    在安装go插件时,会自动更新很多依赖库文件,都是从Github更新下来,但是因为Github的文件中,多有应用go官网中的文件,导致,因为网络缘故,不能直接下载,导致安装失败,如下:   Instal ...

  8. sublime text 3 Package Control无法下载插件

    Package Control无法下载插件,发现是因为被墙了. ubuntu18.04 下使用privoxy设置全局参见:https://www.cnblogs.com/linjunfu/p/1101 ...

  9. jenkins 下载插件失败 有效的处理办法(亲测)

    jenkins 下载插件失败,提示: java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp doe ...

随机推荐

  1. MATLAB 中gcf、gca 以及gco 的区别

    MATLAB 中gcf.gca 以及gco 的区别gcf 返回当前Figure 对象的句柄值gca 返回当前axes 对象的句柄值gco 返回当前鼠标单击的句柄值,该对象可以是除root 对象外的任意 ...

  2. ElasticSearch搜索服务技术

    ElasticSearch 基于的lucene开发的搜索服务技术;天生支持分布式; Es的结构 gatway:存储层,所有的数据可以存储在本地(多个es节点形成分布式存储),hdfs输出位置,共享文件 ...

  3. Oracle 体系结构一 概述

    Oracle服务器由两个实体组成:实例和数据库. 实例由内存结构和进程组成. 它暂时存在于RAM和CPU中.当关闭运行的实例时,实例将消失的无影无踪. 数据库由磁盘上的文件组成.不管在运行状态还是停止 ...

  4. js中两个日期大小比较,获取当前日期,日期加减一天

    一.两个日期大小比较 1.日期参数格式:yyyy-mm-dd // a: 日期a, b: 日期b, flag: 返回的结果 function duibi(a, b,flag) { var arr = ...

  5. RN如何固定底部的按钮

    如上图的底部新增按钮,要是放在web里那是相当简单,直接是用固定定位就行,但是在RN里是没有固定定位可言的. 方案一: 采用绝对定位,相对于最外层的定位在底部位置.(在部分安卓机上有问题,动态计算的高 ...

  6. binlog2sql 用法

    binlog2sql 用法 使用场景:binlog2sql是根据mysql的binlog (要求格式是row)反解析出delete,update操作,对误操作数据进行还原. https://githu ...

  7. html中的定位

    html中的定位体系 一. 分类 1.常规流static 2.浮动float 3.相对定位relative 4.绝对定位absolute 5.固定定位fixed 二.使用时的区分 在网页布局中,常常都 ...

  8. MongoDB如何释放空闲空间?

    当我们从MongoDB中删除文档或集合时,MongoDB并不会将已经占用了的磁盘空间释放,它会一直维护已经占用了磁盘空间的数据文件,尽管数据文件中可能存在大大小小的空记录列表(empty record ...

  9. 流程控制之--if。

    假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断那条岔路是你真正要走的路,如果我们想让程序也能处理这样 ...

  10. 数据结构中的hash

    最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法.那么到底什么是哈希(hash).查找资料发现一个比较有意思的解释,在此分享一下. 人家说的很好我就直接粘过来. =============== ...