<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Thinking

    快樂編程,開心生活
    posts - 21, comments - 27, trackbacks - 0, articles - -5
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    1、查詢緩存

    ? 首先需要配置hibernate.cache.use_query_cache=true

    如果用ehcache,配置ehcache.xml,注意hibernate3.0以后不是net.sf的包名了

    ?1?<cache?name="net.sf.hibernate.cache.StandardQueryCache"
    ?2?
    ?3?maxElementsInMemory="50"?eternal="false"?timeToIdleSeconds="3600"
    ?4?
    ?5?timeToLiveSeconds="7200"?overflowToDisk="true"/>
    ?6?
    ?7?<cache?name="net.sf.hibernate.cache.UpdateTimestampsCache"
    ?8?
    ?9?maxElementsInMemory="5000"?eternal="true"?overflowToDisk="true"/>
    10?
    11?

    ? 然后

    query.setCacheable(true);//激活查詢緩存

    query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可選

    第二行指定要使用的cacheRegion是myCacheRegion,即你可以給每個查詢緩存做一個單獨的配置,

    使用setCacheRegion來做這個指定,需要在ehcache.xml里面配置它:

    1 < cache? name ="myCacheRegion" ?maxElementsInMemory ="10" ?eternal ="false"
    2
    3 timeToIdleSeconds ="3600" ?timeToLiveSeconds ="7200" ?overflowToDisk ="true" ? />
    4
    5


    如果省略第二行,不設(shè)置cacheRegion的話,那么會使用上面提到的標(biāo)準(zhǔn)查詢緩存的配置,也就是

    net.sf.hibernate.cache.StandardQueryCache

    ? 問題:當(dāng)hibernate更新數(shù)據(jù)庫的時候,它怎么知道更新哪些查詢緩存呢?

    ??? hibernate在一個地方維護每個表的最后更新時間,其實也就是放在上面

    net.sf.hibernate.cache.UpdateTimestampsCache所指定的緩存配置里面。

    當(dāng)通過hibernate更新的時候,hibernate會知道這次更新影響了哪些表。然后它更新這些表的最后更新時間。每個緩存都有一個生成時間和這個緩存所查詢的表,當(dāng)hibernate查詢一個緩存是否存在的時候,如果緩存存在,它還要取出緩存的生成時間和這個緩存所查詢的表,然后去查找這些表的最后更新時間,如果有一個表在生成時間后更新過了,那么這個緩存是無效的。可以看出,只要更新過一個表,那么凡是涉及到這個表的查詢緩存就失效了,因此查詢緩存的命中率可能會比較低。

    ? 注意:

    ??? 放入緩存中的key是查詢的語句,value是查詢之后得到的結(jié)果集的id列表。

    表面看來這樣的方案似乎能解決hql利用緩存的問題,但是需要注意的是,構(gòu)成key的是:

    hql生成的sql、sql的參數(shù)、排序、分頁信息等。也就是說如果你的hql有小小的差異,

    比如第一條hql取1-50條數(shù)據(jù),第二條hql取20-60條數(shù)據(jù),那么hibernate會認(rèn)為這是兩個

    完全不同的key,無法重復(fù)利用緩存。因此利用率也不高。

    ?? 查詢緩存必須配合二級緩存一起使用,否則極易出現(xiàn)1+N的情況

    ?? 如果不設(shè)置"查詢緩存",那么hibernate只會緩存使用load()方法獲得的單個持久化對象,

    如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法

    獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置hibernate.cache.use_query_cache true才行,如果需要"查詢緩存",需要在使用Query或Criteria()時設(shè)置其setCacheable(true);屬性。?
    2、Collection緩存

    ? 需要在hbm的collection里面設(shè)置

    < cache? usage ="read-write" />

    假如class是Cat,collection叫children,那么ehcache里面配置

    1 < cache? name ="com.xxx.pojo.Cat.children"
    2
    3 maxElementsInMemory ="20" ?eternal ="false" ?timeToIdleSeconds ="3600"
    4
    5 timeToLiveSeconds ="7200"
    6
    7 overflowToDisk ="true" ? />
    8

    Collection的緩存和前面查詢緩存的list一樣,也是只保持一串id,但它不會因為這個表更新過就

    失效,一個collection緩存僅在這個collection里面的元素有增刪時才失效。

    這樣有一個問題,如果你的collection是根據(jù)某個字段排序的,當(dāng)其中一個元素更新了該字段時,

    導(dǎo)致順序改變時,collection緩存里面的順序沒有做更新?
    3、Class緩存(也稱二級緩存)

    ?? 可由Hibernate提供的二級緩存實現(xiàn),它存在于SessionFactory級別,

    緩存結(jié)構(gòu)可以看作是一個hash table,key是數(shù)據(jù)庫記錄的id,value是id對應(yīng)的pojo對象。

    當(dāng)用戶根據(jù)id查詢對象的時候(load、iterator方法),會首先在緩存中查找,

    如果沒有找到再發(fā)起數(shù)據(jù)庫查詢。但是如果使用hql發(fā)起查詢(find, query方法)

    則不會利用二級緩存,而是直接從數(shù)據(jù)庫獲得數(shù)據(jù),但是它會把得到的數(shù)據(jù)放到二級緩存?zhèn)溆谩R簿褪钦f,基于hql的查詢,對二級緩存是只寫不讀的。?
    在hibernate.cfg.xml配置:

    < property? name ="hibernate.cache.provider_class" >

    ???????org.hibernate.cache.EhCacheProvider

    </ property >

    hibernate3支持

    Hashtable Cache(org.hibernate.cache.HashtableCacheProvider)

    EhCache(org.hibernate.cache.EhCacheProvider)

    OSCache(org.hibernate.cache.OSCacheProvider)

    SwarmCache(org.hibernate.cache.SwarmCacheProvider)

    JBossCache(org.hibernate.cache.TreeCacheProvider)

    在相應(yīng)的POJO配置文件中增加:

    <!--

    指定緩存同步策略:

    read-write???????????????????????????讀寫型

    nonstrict-read-write?????????????非嚴(yán)格讀寫型

    read-only?????????????????????????? ?只讀型

    transactional??????????????????????? 事務(wù)型

    -->

    <cache usage="read-write"/>?

    Cache read-only nonstrict-read-write read-write transactional
    EhCache Yes Yes Yes No
    OSCache Yes Yes Yes No
    SwarmCache Yes Yes No No
    TreeCache Yes No No Yes

    ?????對于一條記錄,也就是一個PO來說,是根據(jù)ID來找的,緩存的key就是ID,value是POJO。無論

    list,load還是iterate,只要讀出一個對象,都會填充緩存。但是list不會使用緩存,而iterate

    會先取數(shù)據(jù)庫select id出來,然后一個id一個id的load,如果在緩存里面有,就從緩存取,沒有

    的話就去數(shù)據(jù)庫load。

    ?? 當(dāng)某個ID通過hibernate修改時,hibernate會知道,于是移除緩存。

    這樣大家可能會想,同樣的查詢條件,第一次先list,第二次再iterate,就可以使用到緩存了。

    實際上這是很難的,因為你無法判斷什么時候是第一次,而且每次查詢的條件通常是不一樣的,假

    如數(shù)據(jù)庫里面有100條記錄,id從1到100,第一次list的時候出了前50個id,第二次iterate的時候

    卻查詢到30至70號id,那么30-50是從緩存里面取的,51到70是從數(shù)據(jù)庫取的,共發(fā)送1+20條sql。

    所以我一直認(rèn)為iterate沒有什么用,總是會有1+N的問題。 如果想要對list或者iterate查詢的結(jié)

    果緩存,就要用到查詢緩存了。?
    ? 注意:

    ?? 對于one-to-many的關(guān)聯(lián)關(guān)系,如果對one應(yīng)用緩存,則應(yīng)同時對many應(yīng)用。

    ?? 二級緩存的失效機制由hibernate控制,當(dāng)某條數(shù)據(jù)被修改之后,hibernate會根據(jù)它的id去做

    緩存失效操作。基于此機制,如果數(shù)據(jù)表不是被hibernate獨占,那么二級緩存無法得到有效控制

    ?? hibernate 3.0在做批量修改、批量更新的時候,是不會同步更新二級緩存的

    ?? 查詢緩存和二級緩存是有關(guān)聯(lián)關(guān)系的,他們不是完全獨立的兩套東西。假如一個查詢條件hql_1

    ,第一次被執(zhí)行的時候,它會從數(shù)據(jù)庫取得數(shù)據(jù),然后把查詢條件作為key,把返回數(shù)據(jù)的所有id

    列表作為value(請注意僅僅是id)放到查詢緩存中,同時整個結(jié)果集放到二級緩存,key是id,

    value是pojo對象。當(dāng)你再次執(zhí)行hql_1,它會從緩存中得到id列表,然后根據(jù)這些列表一個一個的

    到二級緩存里面去找pojo對象,如果找不到就向數(shù)據(jù)庫發(fā)起查詢。也就是說,如果二級緩存配置了

    超時時間,就有可能出現(xiàn)查詢緩存命中了,獲得了id列表,但是class里面相應(yīng)的pojo已經(jīng)因為超

    時被失效,hibernate就會根據(jù)id清單,一個一個的去向數(shù)據(jù)庫查詢,有多少個id,就執(zhí)行多少個

    sql。該情況將導(dǎo)致性能下降嚴(yán)重。

    ?? 查詢緩存的失效機制也由hibernate控制,數(shù)據(jù)進入緩存時會有一個timestamp,它和數(shù)據(jù)表的

    timestamp對應(yīng)。當(dāng)hibernate環(huán)境內(nèi)發(fā)生save、update等操作時,會更新被操作數(shù)據(jù)表的

    timestamp。用戶在獲取緩存的時候,一旦命中就會檢查它的timestamp是否和數(shù)據(jù)表的timestamp

    匹配,如果不,緩存會被失效。因此查詢緩存的失效控制是以數(shù)據(jù)表為粒度的,只要數(shù)據(jù)表中任何

    一條記錄發(fā)生一點修改,整個表相關(guān)的所有查詢緩存就都無效了。因此查詢緩存的命中率可能會很

    低。?
    4、對方法的緩存

    ? 對于調(diào)用頻率較高的查詢類方法,我們希望緩存方法結(jié)果

    在spring中可利用攔截器(Interceptor)實現(xiàn),可能如下面的配置:

    ?1 < beans >
    ?2
    ?3 ???? < bean? id ="cacheInterceptor"
    ?4
    ?5 class ="org.springframework.aop.interceptor.cache.OSCacheInterceptor" >
    ?6
    ?7 ??????? <! -?默認(rèn)刷新時間(秒)- >
    ?8
    ?9 ??????? < property? name ="defaultRefreshPeriod" >
    10
    11 ??????????? < value > 60 </ value >
    12
    13 ??????? </ property >
    14
    15 ??????? < property? name ="identifiers" >
    16
    17 ??????????? < props >
    18
    19 ?????????????? < prop? key ="java.util.Map" > toString </ prop >
    20
    21 ??????????? </ props >
    22
    23 ??????? </ property >
    24
    25 ???? </ bean >
    26
    27 ???? <! -?正則表達式匹配?- >
    28
    29 ???? < bean? id ="searcherAdvisor"
    30
    31 class ="org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
    32
    33 ??????? < property? name ="advice" >
    34
    35 ??????????? < ref? local ="cacheInterceptor" ? />
    36
    37 ??????? </ property >
    38
    39 ??????? < property? name ="patterns" >
    40
    41 ??????????? < list >
    42
    43 ?????????????? < value > .get. </ value >
    44
    45 ??????????? </ list >
    46
    47 ??????? </ property >
    48
    49 ???? </ bean >
    50
    51 ???? <! -?自動代理?- >
    52
    53 ???? < bean? id ="proxyCreator1"
    54
    55 class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
    56
    57 ??????? < property? name ="beanNames" >
    58
    59 ?????????? <!-- ?需截獲方法的bean列表? -->
    60
    61 ??????????? < list >
    62
    63 ?????????????? < value > commonSelect </ value >
    64
    65 ??????????? </ list >
    66
    67 ??????? </ property >
    68
    69 ??????? < property? name ="interceptorNames" >
    70
    71 ?????????? <!-- ?截獲器列表? -->
    72
    73 ??????????? < list >
    74
    75 ?????????????? < value > searcherAdvisor </ value >
    76
    77 ??????????? </ list >
    78
    79 ??????? </ property >
    80
    81 ???? </ bean >
    82
    83 < beans >
    84
    85

    ?這里通過自動代理創(chuàng)建bean,并指定作用其上的interceptor列表,在commonSelect存在searchAdvisor,

    而searchAdvisor對匹配*get*模式的方法調(diào)用將通過cacheInterceptor進行處理。

    posted @ 2007-02-06 17:31 lixw 閱讀(636) | 評論 (0)編輯 收藏

    緩存---基礎(chǔ)理論篇???
    ??????????
    1.?? 緩存
    ????? 緩存介于應(yīng)用程序和永久性數(shù)據(jù)存儲源之間,它的作用是降低應(yīng)用程序直接讀寫永久數(shù)據(jù)存儲源的頻率,從而提高應(yīng)用的運行性能。
    ????? 緩存中的數(shù)據(jù)是數(shù)據(jù)存儲源中數(shù)據(jù)的拷貝,應(yīng)用程序在運行時直接讀寫緩存中的數(shù)據(jù),只在某些特定時刻按照緩存中的數(shù)據(jù)來同步更新數(shù)據(jù)存儲源。
    ????? 緩存的介質(zhì)一般是內(nèi)存,所以讀寫速度很快。但如果緩存中存放的數(shù)據(jù)量非常大時,也會用硬盤作為緩存介質(zhì)。緩存的實現(xiàn)不僅僅要考慮存儲的介質(zhì),還要考慮到管理緩存的并發(fā)訪問和緩存數(shù)據(jù)的生命周期。??

    2.?? 各類CACHE簡介

    2.1.?? Java Caching System
    ?????? JSC(Java Caching System)是一個用分布式的緩存系統(tǒng),是基于服務(wù)器的java應(yīng)用程序。它是通過提供管理各種動態(tài)緩存數(shù)據(jù)來加速動態(tài)web應(yīng)用。JCS和其他緩存系統(tǒng)一樣,也是一個用于高速讀取,低速寫入的應(yīng)用程序。動態(tài)內(nèi)容和報表系統(tǒng)能夠獲得更好的性能。如果一個網(wǎng)站,有重復(fù)的網(wǎng)站結(jié)構(gòu),使用間歇性更新方式的數(shù)據(jù)庫(而不是連續(xù)不斷的更新數(shù)據(jù)庫),被重復(fù)搜索出相同結(jié)果的,就能夠通過執(zhí)行緩存方式改進其性能和伸縮性。  
    官方網(wǎng)站 http://jakarta.apache.org/turbine/jcs/

    2.2? ?EHCache
    ????? EHCache 是一個純java的在進程中的緩存,它具有以下特性:快速,簡單,為Hibernate2.1充當(dāng)可插入的緩存,最小的依賴性,全面的文檔和測試。
    官方網(wǎng)站 http://ehcache.sourceforge.net/;

    2.3.?? OSCache
    ???????OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應(yīng)用程序的普通的緩存解決方案。
    ?????? OSCache有以下特點:
    ?????? 緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
    ?????? 擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
    ????? 永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創(chuàng)建(expensive-to-create)數(shù)據(jù)來保持緩存,甚至能讓應(yīng)用重啟。
    ????? 支持集群--集群緩存數(shù)據(jù)能被單個的進行參數(shù)配置,不需要修改代碼。
    ????? 緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認(rèn)性能不需要時)。
    官方網(wǎng)站 http://www.opensymphony.com/oscache/

    2.4.?? JCache
    ?????? JCache是個開源程序,正在努力成為JSR-107開源規(guī)范,JSR-107規(guī)范已經(jīng)很多年沒改變了。這個版本仍然是構(gòu)建在最初的功能定義上。
    官方網(wǎng)站 http://jcache.sourceforge.net/

    ?2.5.?? ShiftOne
    ??????? ShiftOne Java Object Cache是一個執(zhí)行一系列嚴(yán)格的對象緩存策略的Java lib,就像一個輕量級的配置緩存工作狀態(tài)的框架。
    官方網(wǎng)站 http://jocache.sourceforge.net/

    ? 2.6.?? SwarmCache
    ??????? SwarmCache是一個簡單且有效的分布式緩存,它使用IP multicast與同一個局域網(wǎng)的其他主機進行通訊,是特別為集群和數(shù)據(jù)驅(qū)動web應(yīng)用程序而設(shè)計的。SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應(yīng)用提供更好的性能支持。SwarmCache使用JavaGroups來管理從屬關(guān)系和分布式緩存的通訊。
    官方網(wǎng)站 http://swarmcache.sourceforge.net

    ?2.7.?? TreeCache / JBossCache 
    ??????? JBossCache是一個復(fù)制的事務(wù)處理緩存,它允許你緩存企業(yè)級應(yīng)用數(shù)據(jù)來更好的改善性能。緩存數(shù)據(jù)被自動復(fù)制,讓你輕松進行JBoss服務(wù)器之間的集群工作。JBossCache能夠通過JBoss應(yīng)用服務(wù)或其他J2EE容器來運行一個MBean服務(wù),當(dāng)然,它也能獨立運行。JBossCache包括兩個模塊:TreeCache和TreeCacheAOP。TreeCache --是一個樹形結(jié)構(gòu)復(fù)制的事務(wù)處理緩存。TreeCacheAOP --是一個"面向?qū)ο?緩存,它使用AOP來動態(tài)管理POJO(Plain Old Java Objects)
    官方網(wǎng)站 http://www.jboss.org/products/jbosscache;

    ?2.8.?? WhirlyCache
    ??????? Whirlycache是一個快速的、可配置的、存在于內(nèi)存中的對象的緩存。它能夠通過緩存對象來加快網(wǎng)站或應(yīng)用程序的速度,否則就必須通過查詢數(shù)據(jù)庫或其他代價較高的處理程序來建立。
    官方網(wǎng)站 https://whirlycache.dev.java.net/

    posted @ 2007-02-06 17:27 lixw 閱讀(314) | 評論 (0)編輯 收藏

    一、最簡單的方式:
    設(shè)置表單form 的 method=”post” ENCTYPE="multipart/form-data"
    通過
    InputStream in =servletRequest.getInputStream();
    以流的方式處理,它的缺點就不言而喻了

    二、commons-fileupload:
    官方網(wǎng)站:[http://jakarta.apache.org/commons/fileupload/]
    它提供基于Servlet的上傳,可上傳到內(nèi)存、文件,且文件的上傳位置,最大上傳文件字節(jié)數(shù)可以在程序中設(shè)置,
    特別是對于多文件上傳支持較好,List items = upload.parseRequest(request)就可以處理多文件,其他都不用考慮,
    提供了item.isFormField()判斷是否為標(biāo)準(zhǔn)表單值的方法,簡潔實用,但是可配置仍然不好,對API的依賴性很大

    使用步驟:
    1、首先判斷一個HttpServletRequest是否是一個上傳文件的請求:
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    2、處理請求:
    2.1、創(chuàng)建基于硬盤存儲的工廠
    DiskFileItemFactory factory = new DiskFileItemFactory();
    /* 或者
    DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory);
    */
    2.2、設(shè)置工廠屬性,從而生成個性化ServletFileUpload
    //設(shè)置最多只允許在內(nèi)存中存儲的數(shù)據(jù),單位:字節(jié)
    factory.setSizeThreshold(yourMaxMemorySize);
    // 設(shè)置一旦文件大小超過getSizeThreshold()的值時數(shù)據(jù)存放在硬盤的目錄
    factory.setRepository(yourTempDirectory);
    2、處理上傳文件:
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
    ?? FileItem item = (FileItem) iter.next();
    ?? //判斷是否為標(biāo)準(zhǔn)表單域
    ?? if (item.isFormField()) {
    ??????? String name = item.getFieldName();
    ?String value = item.getString();
    ???…
    ??? ?} else {
    ??String fieldname = item.getFieldName();
    ??String filename = item.getName();
    ??String contentType = item.getContentType();
    ??boolean isInMemory = item.isInMemory();
    ??long sizeInBytes = item.getSize();
    ??…
    ?//直接從內(nèi)存訪問上傳數(shù)據(jù)
    ?byte[] data = item.get();
    ???
    ?//采用流方式讀取上傳文件
    ?InputStream stream = item.openStream();

    ?// 保存到文件
    ?if (writeToFile) {
    ?File uploadedFile = new File(storeFilePath);
    ?item.write(uploadedFile);
    ??? } else {
    ?//轉(zhuǎn)換為輸出流
    ?InputStream uploadedStream = item.getInputStream();
    ?...
    ?uploadedStream.close();
    ?}
    }
    ...

    三、javazoom的UploadBean:
    官方網(wǎng)站:[http://www.javazoom.net/jzservlets/uploadbean/uploadbean.html]

    功能強大,支持上傳到文件系統(tǒng),數(shù)據(jù)庫,同時它還有一些高級功能,如對上傳的監(jiān)聽,overwrite過濾器、自定義解析器、
    overwrite策略、黑名單、白名單等,特別是它采用了JavaBean方式,所以在JSP頁面可以輕松的采用

    從而實現(xiàn)上傳到硬盤目錄但是它的源代碼是需要Money的,我們只能得到它的jar包和API Doc,
    同時它對多文件上傳處理的不是很好(我覺得)。

    官方網(wǎng)站上有詳細(xì)的說明供參考。

    四、Jspsmartupload
    官方網(wǎng)站:[http://www.jspsmart.com/] 可惜一直打不開
    這里有一篇文章說明:[http://java.ccidnet.com/art/3737/20060717/638255_1.html]

    posted @ 2007-02-06 17:19 lixw 閱讀(518) | 評論 (0)編輯 收藏

    ?1 < script?language = " javascript " > ?
    ?2 // 行追加?
    ?3 function ?lineAdd()?
    ?4 {?
    ?5 var ?count? = ? 1 ;?
    ?6 var ?newLine_1? = ? " <tr> " ?
    ?7 newLine_1? += ? " <td><input?type='file'?size='30'?name='uploadfile " ? + ?count? + ? " '></td> " ;?
    ?8 count ++ ;?
    ?9 newLine_1? += ? " <td><input?type='button'?value='刪除'?style='cursor:hand'?onClick='lineDel(this)'></td> " ;?
    10 newLine_1? += ? " </tr> " ;?
    11
    12 var ?tmp? = ? "" ;?
    13 tmp? = ? " <table?id='D1'> " ;?
    14 tmp? += ?D1.innerHTML;?
    15 tmp? += ?newLine_1;?
    16 tmp? += ? " </table> " ;?
    17 D1.outerHTML? = ?tmp;?
    18 }
    ?
    19
    20 // 行刪除?
    21 function ?lineDel(btn)?
    22 {?
    23 D1.deleteRow(btn.parentNode.parentNode.rowIndex);?
    24 }
    ?
    25
    26 </ script >

    posted @ 2007-02-06 17:17 lixw 閱讀(434) | 評論 (0)編輯 收藏

    ?1 import ?java.security. * ;?????
    ?2 ???
    ?3 public ? class ?MD5 {?????
    ?4 ???
    ?5 ? public ? final ? static ?String?getMD5(String?s) {?????
    ?6 ?? char ?hexDigits[]? = ? {?????
    ?7 ???? ' 0 ' ,? ' 1 ' ,? ' 2 ' ,? ' 3 ' ,?????
    ?8 ???? ' 4 ' ,? ' 5 ' ,? ' 6 ' ,? ' 7 ' ,?????
    ?9 ???? ' 8 ' ,? ' 9 ' ,? ' a ' ,? ' b ' ,?????
    10 ???? ' c ' ,? ' d ' ,? ' e ' ,? ' f ' }
    ;?????
    11 ?? try ? {?????
    12 ??? byte []?strTemp? = ?s.getBytes();?????
    13 ???MessageDigest?mdTemp? = ?MessageDigest.getInstance( " MD5 " );?????
    14 ???mdTemp.update(strTemp);?????
    15 ??? byte []?md? = ?mdTemp.digest();?????
    16 ??? int ?j? = ?md.length;?????
    17 ??? char ?str[]? = ? new ? char [j? * ? 2 ];?????
    18 ??? int ?k? = ? 0 ;?????
    19 ??? for ?( int ?i? = ? 0 ;?i? < ?j;?i ++ )? {?????
    20 ???? byte ?byte0? = ?md[i];?????
    21 ????str[k ++ ]? = ?hexDigits[byte0? >>> ? 4 ? & ? 0xf ];?????
    22 ????str[k ++ ]? = ?hexDigits[byte0? & ? 0xf ];?????
    23 ???}
    ?????
    24 ??? return ? new ?String(str);?????
    25 ??}
    catch ?(Exception?e) {?????
    26 ??? return ? null ;?????
    27 ??}
    ?????
    28 ?}
    ?????
    29 ?????
    30 ? public ? static ? void ?main(String[]?args) {?????
    31 ???
    32 ??System.out.print(MD5.getMD5( " abcd " ));?????
    33 ?}
    ????
    34 }
    ????
    35

    posted @ 2007-02-06 17:15 lixw 閱讀(157) | 評論 (0)編輯 收藏

    僅列出標(biāo)題
    共4頁: 上一頁 1 2 3 4 
    主站蜘蛛池模板: 免费激情网站国产高清第一页| 全免费A级毛片免费看网站| 老牛精品亚洲成av人片| 亚洲av永久无码精品古装片| 免费一级毛片在播放视频| 毛片在线看免费版| 日韩免费精品视频| 一个人免费日韩不卡视频| 久久WWW免费人成—看片| 国产亚洲人成在线播放| 伊人久久五月丁香综合中文亚洲 | 亚洲精品女同中文字幕| 亚洲综合男人的天堂色婷婷| 亚洲高清国产AV拍精品青青草原| 久久久久亚洲AV成人网| 亚洲国产a级视频| 一级毛片直播亚洲| 国产午夜无码视频免费网站| 天天天欲色欲色WWW免费| 国语成本人片免费av无码 | 亚洲国产中文在线视频| 亚洲一二成人精品区| 久久久久亚洲精品美女| 亚洲精品你懂的在线观看 | 男女午夜24式免费视频| 在线观看肉片AV网站免费 | 亚洲嫩草影院久久精品| 亚洲AV无码欧洲AV无码网站| 国产成人亚洲综合色影视 | 久久99国产乱子伦精品免费 | 亚洲国产成人精品无码区在线秒播 | 亚洲国产成人久久综合碰| 亚洲 小说区 图片区 都市| 国产公开免费人成视频| 亚洲а∨天堂久久精品| 俄罗斯极品美女毛片免费播放| 国产成人精品高清免费| 又爽又高潮的BB视频免费看 | 黄色免费网址在线观看| 无码精品人妻一区二区三区免费| 人成午夜免费大片在线观看|