精华内容
下载资源
问答
  • 理解Angular中的$apply()以及$digest()

    万次阅读 多人点赞 2014-08-20 13:49:13
    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑。而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的。这篇文章旨在解释$apply()和$digest()是什么,以及在...

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑。而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的。这篇文章旨在解释$apply()和$digest()是什么,以及在日常的编码中如何应用它们。

     

    探索$apply()和$digest()

    AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式。数据绑定意味着当View中有任何数据发生了变化,那么这个变化也会自动地反馈到scope的数据上,也即意味着scope模型会自动地更新。类似地,当scope模型发生变化时,view中的数据也会更新到最新的值。那么AngularJS是如何做到这一点的呢?当你写下表达式如{{ aModel }}时,AngularJS在幕后会为你在scope模型上设置一个watcher,它用来在数据发生变化的时候更新view。这里的watcher和你会在AngularJS中设置的watcher是一样的:

     

    $scope.$watch('aModel', function(newValue, oldValue) {
      //update the DOM with newValue
    });

     

    传入到$watch()中的第二个参数是一个回调函数,该函数在aModel的值发生变化的时候会被调用。当aModel发生变化的时候,这个回调函数会被调用来更新view这一点不难理解,但是,还存在一个很重要的问题!AngularJS是如何知道什么时候要调用这个回调函数呢?换句话说,AngularJS是如何知晓aModel发生了变化,才调用了对应的回调函数呢?它会周期性的运行一个函数来检查scope模型中的数据是否发生了变化吗?好吧,这就是$digest循环的用武之地了。

     

    在$digest循环中,watchers会被触发。当一个watcher被触发时,AngularJS会检测scope模型,如何它发生了变化那么关联到该watcher的回调函数就会被调用。那么,下一个问题就是$digest循环是在什么时候以各种方式开始的?

     

    在调用了$scope.$digest()后,$digest循环就开始了。假设你在一个ng-click指令对应的handler函数中更改了scope中的一条数据,此时AngularJS会自动地通过调用$digest()来触发一轮$digest循环。当$digest循环开始后,它会触发每个watcher。这些watchers会检查scope中的当前model值是否和上一次计算得到的model值不同。如果不同,那么对应的回调函数会被执行。调用该函数的结果,就是view中的表达式内容(译注:诸如{{ aModel }})会被更新。除了ng-click指令,还有一些其它的built-in指令以及服务来让你更改models(比如ng-model,$timeout等)和自动触发一次$digest循环。

     

    目前为止还不错!但是,有一个小问题。在上面的例子中,AngularJS并不直接调用$digest(),而是调用$scope.$apply(),后者会调用$rootScope.$digest()。因此,一轮$digest循环在$rootScope开始,随后会访问到所有的children scope中的watchers。

     

    现在,假设你将ng-click指令关联到了一个button上,并传入了一个function名到ng-click上。当该button被点击时,AngularJS会将此function包装到一个wrapping function中,然后传入到$scope.$apply()。因此,你的function会正常被执行,修改models(如果需要的话),此时一轮$digest循环也会被触发,用来确保view也会被更新。

     

    Note: $scope.$apply()会自动地调用$rootScope.$digest()。$apply()方法有两种形式。第一种会接受一个function作为参数,执行该function并且触发一轮$digest循环。第二种会不接受任何参数,只是触发一轮$digest循环。我们马上会看到为什么第一种形式更好。

     

    什么时候手动调用$apply()方法?

    如果AngularJS总是将我们的代码wrap到一个function中并传入$apply(),以此来开始一轮$digest循环,那么什么时候才需要我们手动地调用$apply()方法呢?实际上,AngularJS对此有着非常明确的要求,就是它只负责对发生于AngularJS上下文环境中的变更会做出自动地响应(即,在$apply()方法中发生的对于models的更改)。AngularJS的built-in指令就是这样做的,所以任何的model变更都会被反映到view中。但是,如果你在AngularJS上下文之外的任何地方修改了model,那么你就需要通过手动调用$apply()来通知AngularJS。这就像告诉AngularJS,你修改了一些models,希望AngularJS帮你触发watchers来做出正确的响应。

     

    比如,如果你使用了JavaScript中的setTimeout()来更新一个scope model,那么AngularJS就没有办法知道你更改了什么。这种情况下,调用$apply()就是你的责任了,通过调用它来触发一轮$digest循环。类似地,如果你有一个指令用来设置一个DOM事件listener并且在该listener中修改了一些models,那么你也需要通过手动调用$apply()来确保变更会被正确的反映到view中。

     

    让我们来看一个例子。加入你有一个页面,一旦该页面加载完毕了,你希望在两秒钟之后显示一条信息。你的实现可能是下面这个样子的:

     

    HTML:

     

    <body ng-app="myApp">
      <div ng-controller="MessageController">
        Delayed Message: {{message}}
      </div>  
    </body>

     

     

    JavaScript:
    /* What happens without an $apply() */
        
        angular.module('myApp',[]).controller('MessageController', function($scope) {
        
          $scope.getMessage = function() {
            setTimeout(function() {
              $scope.message = 'Fetched after 3 seconds';
              console.log('message:'+$scope.message);
            }, 2000);
          }
          
          $scope.getMessage();
        
        });

     

    通过运行这个例子,你会看到过了两秒钟之后,控制台确实会显示出已经更新的model,然而,view并没有更新。原因也许你已经知道了,就是我们忘了调用$apply()方法。因此,我们需要修改getMessage(),如下所示:

     

     

    /* What happens with $apply */ 
    angular.module('myApp',[]).controller('MessageController', function($scope) {
        
          $scope.getMessage = function() {
            setTimeout(function() {
              $scope.$apply(function() {
                //wrapped this within $apply
                $scope.message = 'Fetched after 3 seconds'; 
                console.log('message:' + $scope.message);
              });
            }, 2000);
          }
          
          $scope.getMessage();
        
        });

     

     

    如果你运行了上面的例子,你会看到view在两秒钟之后也会更新。唯一的变化是我们的代码现在被wrapped到了$scope.$apply()中,它会自动触发$rootScope.$digest(),从而让watchers被触发用以更新view。

     

    Note:顺便提一下,你应该使用$timeout service来代替setTimeout(),因为前者会帮你调用$apply(),让你不需要手动地调用它。

     

    而且,注意在以上的代码中你也可以在修改了model之后手动调用没有参数的$apply(),就像下面这样:

     

    $scope.getMessage = function() {
      setTimeout(function() {
        $scope.message = 'Fetched after two seconds';
        console.log('message:' + $scope.message);
        $scope.$apply(); //this triggers a $digest
      }, 2000);
    };

     

    以上的代码使用了$apply()的第二种形式,也就是没有参数的形式。需要记住的是你总是应该使用接受一个function作为参数的$apply()方法。这是因为当你传入一个function到$apply()中的时候,这个function会被包装到一个try…catch块中,所以一旦有异常发生,该异常会被$exceptionHandler service处理。

     

    $digest循环会运行多少次?

    当一个$digest循环运行时,watchers会被执行来检查scope中的models是否发生了变化。如果发生了变化,那么相应的listener函数就会被执行。这涉及到一个重要的问题。如果listener函数本身会修改一个scope model呢?AngularJS会怎么处理这种情况?

     

    答案是$digest循环不会只运行一次。在当前的一次循环结束后,它会再执行一次循环用来检查是否有models发生了变化。这就是脏检查(Dirty Checking),它用来处理在listener函数被执行时可能引起的model变化。因此,$digest循环会持续运行直到model不再发生变化,或者$digest循环的次数达到了10次。因此,尽可能地不要在listener函数中修改model。

     

    Note: $digest循环最少也会运行两次,即使在listener函数中并没有改变任何model。正如上面讨论的那样,它会多运行一次来确保models没有变化。

     

    结语

    我希望这篇文章解释清楚了$apply和$digest。需要记住的最重要的是AngularJS是否能检测到你对于model的修改。如果它不能检测到,那么你就需要手动地调用$apply()。

     

     

    原文地址

    http://www.sitepoint.com/understanding-angulars-apply-digest/

     

     

     

     

     

     

    展开全文
  • ch_digest:ch_digest-源码

    2021-04-12 02:11:07
    ch_digest 一个自定义工具,用于从Clubhouse提取导出的数据。 Ruby要求 该程序已经过Ruby 2.5.3的测试,并且可以与任何Ruby 2.x版本一起使用,并且可能与更高版本一起使用。 跑步 使用Ruby解释器(2.5.3或更高版本...
  • Http Digest 鉴权

    2020-06-21 14:16:02
    “摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的...
  • t-digest源码

    2018-07-27 16:24:39
    t-digest 最新源码分享,t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest 最新源码分享t-digest ...
  • digest-delivery-源码

    2021-03-09 05:26:32
    digest-delivery
  • ISSCC2008 - Digest.rar

    2020-04-04 09:33:18
    ISSCC2008 - Digest.pdf ISSCC2008 - Digest.docx 2008 IEEE Intemational Solid-State Circuits Conference DIGEST OF TECHNICAL PAPERS
  • ISSCC2009 - Digest.rar

    2020-04-04 09:37:10
    ISSCC2009 - Digest.pdf ISSCC2009 - Digest.docx 2009 IEEE Intemational Solid-State Circuits Conference DIGEST OF TECHNICAL PAPERS
  • ISSCC 2013 - Digest.rar

    2020-04-06 00:19:44
    ISSCC 2013 - Digest .word ISSCC 2013 - Digest .pdf
  • HTTP Digest Auth库创建与HTTP Digest身份验证一起使用的auth标头 安装 您可以通过以下方式从十六进制安装此软件包: def deps do [{ :http_digex , " ~> 0.0.1 " }] end 或者,您可以选择从github安装,如下所...
  • ISSCC 2012 - Digest .rar

    2020-04-06 00:24:29
    ISSCC 2012 - Digest .pdf ISSCC 2012 - Digest .doc word较大,打开比较慢
  • 安全运行的简单服务$scope.$digest() 。 安装 要安装此软件包类型: bower install angular-digest --save 用法 首先在您的应用程序页面中包含脚本(在您包含文件之后): < script src =" /bower_components/...
  • gSky Digest-开源

    2021-04-27 16:36:35
    gSky Digest是一个系统任务栏桌面应用程序,它显示为您的家乡位置计算的天文学事件。 目前,它包含有关太阳,月亮和7个行星的详细信息。 有关更多详细信息,请参见Project网站。
  • t-digest-3.2.jar

    2021-03-01 11:02:10
    t-digest-3.2.jar
  • 将任何网页上的事件直接导入Startup Digest。 Startup Digest Clipper是跨浏览器的扩展,可帮助策展人将高质量事件导入StartupDigest,从而使策展人花费更少的时间复制粘贴事件数据并花费更多时间来建立社区。 ...
  • digest鉴权

    千次阅读 2016-09-22 13:16:56
    “摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的...

    转自:http://blog.renren.com/share/1414450682/14622488039

    “摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的口令。
    摘要认证就是要核实,参与通信的双方,都知道双方共享的一个秘密(即口令)。

    当服务器想要查证用户的身份,它产生一个摘要盘问(digest challenge),并发送给用户。典型的摘要盘问如下:

    Digest realm="iptel.org", qop="auth,auth-int",
    nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="", algorithm=MD5

    这里包括了一组参数,也要发送给用户。用户使用这些参数,来产生正确的摘要回答,并发送给服务器。摘要盘问中的各个参数,其意义如下:

    realm(领域):领域参数是强制的,在所有的盘问中都必须有。它是目的是鉴别SIP消息中的机密。在SIP实际应用中,它通常设置为SIP代理服务器所负责的域名。

    在要求用户输入用户名和口令时,SIP用户代理则会显示这个参数的内容给用户,以便用户使用正确的用户名和口令(这个服务器的)。

    nonce(现时):这是由服务器规定的数据字符串,在服务器每次产生一个摘要盘问时,这个参数都是不一样的(与前面所产生的不会雷同)。“现时”通常是由一些数据通过md5杂凑运算构造的。这样的数据通常包括时间标识和服务器的机密短语。这确保每个“现时”都有一个有限的生命期(也就是过了一些时间后会失效,并且以后再也不会使用),而且是独一无二的(即任何其它的服务器都不能产生一个相同的“现时”)。

    客户端使用这个“现时”来产生摘要响应(digest response),这样服务器也会在一个摘要响应中收到“现时”的内容。服务器先要检查了“现时”的有效性后,才会检查摘要响应的其它部分。

    因而,“现时”在本质上是一种标识符,确保收到的摘要机密,是从某个特定的摘要盘问产生的。还限制了摘要盘问的生命期,防止未来的重播攻击。


    opaque(不透明体):这是一个不透明的(不让外人知道其意义)数据字符串,在盘问中发送给用户。

    在摘要响应中,用户会将这个数据字符串发送回给服务器。这使得服务器可以是无状态的。如果需要在盘问和响应之间维护一些状态,可以用这个参数传送状态给客户端,此后当摘要响应回来时,再读这个状态。

    algorithm(算法):这是用来计算杂凑的算法。当前只支持MD5算法。

    qop(保护的质量)。这个参数规定服务器支持哪种保护方案。客户端可以从列表中选择一个。值

    “auth”表示只进行身份查验, “auth-int”表示进行查验外,还有一些完整性保护。需要看更详细的描述,请参阅RFC2617。

    在收到了摘要盘问后,如果没有预先配置,用户代理软件通常会提示用户输入用户名和口令,产生一个摘要响应,并将这个响应发送给服务器。例如,摘要响应可能如下:

    Digest username="jan", realm="iptel.org",
    nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="sip:iptel.org",
    qop=auth, nc=00000001, cnonce="0a4f113b",
    response="6629fae49393a05397450978507c4ef1", opaque=""

    摘要响应类似于摘要盘问。相同的参数,则与摘要盘问有相同的意义。这里只描述新的参数:

    uri(统一资源指示符):这个参数包含了客户端想要访问的URI。
    qop:客户端选择的保护方式。
    nc:“现时”计数器,这是一个16进制的数值,即客户端发送出请求的数量(包括当前这个请求),这

    些请求都使用了当前请求中这个“现时”值。例如,对一个给定的“现时”值,在响应的第一个请求中,客户端将发送“nc=00000001”。这个指示值的目的,是让服务器保持这个计数器的一个副本,以便检测重复的请求。如果这个相同的值看到了两次,则这个请求是重复的。

    cnonce:这也是一个不透明的字符串值,由客户端提供,并且客户端和服务器都会使用,以避免用明文文本。这使得双方都可以查验对方的身份,并对消息的完整性提供一些保护。

    response(响应):这是由用户代理软件计算出的一个字符串,以证明用户知道口令。

    当服务器接收到摘要响应,也要重新计算响应中各参数的值,并利用客户端提供的参数值,和服务器上存储的口令,进行比对。如果计算结果与收到的客户响应值是相同的,则客户已证明它知道口令,因而客户的身份验证通过。


    Digest access authentication

    From Wikipedia, the free encyclopedia

    Digest access authentication is one of the agreed-upon methods a web server can use to negotiate credentials with a user's web browser. It applies a hash function to a password before sending it over the network, which is safer than basic access authentication, which sends plaintext.


    Technically, digest authentication is an application of MD5 cryptographic hashing with usage of nonce values to discourage cryptanalysis. It uses the HTTPprotocol.




    Contents


       [hide


    Overview


    Digest access authentication was originally specified by RFC 2069 (An Extension to HTTP: Digest Access Authentication). RFC 2069 specifies roughly a traditional digest authentication scheme with security maintained by a server-generated nonce value. The authentication response is formed as follows (where HA1, HA2, A1, A2 are names of string variables):


    \mathrm{HA1} = \mathrm{MD5}\Big(\mathrm{A1}\Big) = \mathrm{MD5}\Big( \mathrm{username} : \mathrm{realm} : \mathrm{password} \Big)
    \mathrm{HA2} = \mathrm{MD5}\Big(\mathrm{A2}\Big) = \mathrm{MD5}\Big( \mathrm{method} : \mathrm{digestURI} \Big)
    \mathrm{response} = \mathrm{MD5}\Big( \mathrm{HA1} : \mathrm{nonce} : \mathrm{HA2} \Big)

    RFC 2069 was later replaced by RFC 2617 (HTTP Authentication: Basic and Digest Access Authentication). RFC 2617 introduced a number of optional security enhancements to digest authentication; "quality of protection" (qop), nonce counter incremented by client, and a client-generated random nonce. These enhancements are designed to protect against, for example,chosen-plaintext attack cryptanalysis.


    \mathrm{HA1} = \mathrm{MD5}\Big(\mathrm{A1}\Big) = \mathrm{MD5}\Big( \mathrm{username} : \mathrm{realm} : \mathrm{password} \Big)

    If the qop directive's value is "auth" or is unspecified, then HA2 is


    \mathrm{HA2} = \mathrm{MD5}\Big(\mathrm{A2}\Big) = \mathrm{MD5}\Big( \mathrm{method} : \mathrm{digestURI} \Big)

    If the qop directive's value is "auth-int", then HA2 is


    \mathrm{HA2} = \mathrm{MD5}\Big(\mathrm{A2}\Big) = \mathrm{MD5}\Big( \mathrm{method} : \mathrm{digestURI} : \mathrm {MD5}(entityBody)\Big)

    If the qop directive's value is "auth" or "auth-int", then compute the response as follows:


    \mathrm{response} = \mathrm{MD5}\Big( \mathrm{HA1} : \mathrm{nonce} : \mathrm{nonceCount} : \mathrm{clientNonce} : \mathrm{qop} : \mathrm{HA2} \Big)

    If the qop directive is unspecified, then compute the response as follows:


    \mathrm{response} = \mathrm{MD5}\Big( \mathrm{HA1} : \mathrm{nonce} : \mathrm{HA2} \Big)

    The above shows that when qop is not specified, the simpler RFC 2069 standard is followed.


    [edit]Impact of MD5 security on digest authentication


    The MD5 calculations used in HTTP digest authentication is intended to be "one way", meaning that it should be difficult to determine the original input when only the output is known. If the password itself is too simple, however, then it may be possible to test all possible inputs and find a matching output (a brute-force attack) – perhaps aided by a dictionary or suitable look-up list.


    The HTTP scheme was designed by Phillip Hallam-Baker at CERN in 1993 and does not incorporate subsequent improvements in authentication systems, such as the development of keyed-hash message authentication code (HMAC). Although the cryptographic construction that is used is based on the MD5 hash function, collision attacks were in 2004 generally believed to not affect applications where the plaintext (i.e. password) is not known.[1][citation needed] However, claims in 2006 (Kim, Biryukov2, Preneel, Hong, "On the Security of HMAC and NMAC Based on HAVAL MD4 MD5 SHA-0 and SHA-1") cause some doubt over other MD5 applications as well. So far, however, MD5 collision attacks have not been shown to pose a threat to digest authentication, and the RFC 2617 allows servers to implement mechanisms to detect some collision and replay attacks.


    [edit]HTTP digest authentication considerations


    [edit]Advantages


    HTTP digest authentication is designed to be more secure than traditional digest authentication schemes; e.g., "significantly stronger than (e.g.) CRAM-MD5 ..." (RFC2617).


    Some of the security strengths of HTTP digest authentication are:



    • The password is not used directly in the digest, but rather HA1 = MD5(username:realm:password). This allows some implementations (e.g. JBoss DIGESTAuth) to store HA1 rather than thecleartext password.
    • Client nonce was introduced in RFC 2617, which allows the client to prevent Chosen-plaintext attacks (which otherwise makes e.g. rainbow tables a threat to digest authentication schemes).
    • Server nonce is allowed to contain timestamps. Therefore the server may inspect nonce attributes submitted by clients, to prevent replay attacks.
    • Server is also allowed to maintain a list of recently issued or used server nonce values to prevent reuse.

    [edit]Disadvantages


    Digest access authentication is intended as a security trade-off. It is intended to replace unencrypted HTTP basic access authentication. It is not, however, intended to replace strong authentication protocols, such as public-key or Kerberos authentication.


    In terms of security, there are several drawbacks with digest access authentication:



    • Many of the security options in RFC 2617 are optional. If quality-of-protection (qop) is not specified by the server, the client will operate in a security-reduced legacy RFC 2069 mode.
    • Digest access authentication is vulnerable to a man-in-the-middle (MitM) attack. For example, a MitM attacker could tell clients to use basic access authentication or legacy RFC2069 digest access authentication mode. To extend this further, digest access authentication provides no mechanism for clients to verify the server's identity.
    • Some servers require passwords to be stored using reversible encryption. However, it is possible to instead store the digested value of the username, realm, and password.[2]
    • It prevents the use of a strong password hash (such as bcrypt) when storing passwords (since either the password, or the digested username, realm and password must be recoverable).

    [edit]Alternative authentication protocols


    Some strong authentication protocols for web-based applications include:



    Weak cleartext protocols are also often in use:



    These weak cleartext protocols used together with HTTPS network encryption resolve many of the threats that digest access authentication is designed to prevent.


    [edit]Example with explanation


    The following example was originally given in RFC 2617 and is expanded here to show the full text expected for each request and response. Note that only the "auth" (authentication) quality of protection code is covered – at the time of writing, only the Opera and Konqueror web browsers are known to support "auth-int" (authentication with integrity protection). Although the specification mentions HTTP version 1.1, the scheme can be successfully added to a version 1.0 server, as shown here.


    This typical transaction consists of the following steps.



    • The client asks for a page that requires authentication but does not provide a username and password. Typically this is because the user simply entered the address or followed a link to the page.
    • The server responds with the 401 "Unauthorized" response code, providing the authentication realm and a randomly-generated, single-use value called a nonce.
    • At this point, the browser will present the authentication realm (typically a description of the computer or system being accessed) to the user and prompt for a username and password. The user may decide to cancel at this point.
    • Once a username and password have been supplied, the client re-sends the same request but adds an authentication header that includes the response code.
    • In this example, the server accepts the authentication and the page is returned. If the username is invalid and/or the password is incorrect, the server might retu
    ...
    展开全文
  • ISSCC2011 - Digest.rar

    2020-04-04 09:41:12
    ISSCC2010 - Digest.pdf ISSCC2010 - Digest.docx 2010 IEEE Intemational Solid-State Circuits Conference DIGEST OF TECHNICAL PAPERS
  • ISSCC2010 - Digest.rar

    2020-04-04 09:36:59
    ISSCC2010 - Digest.pdf ISSCC2010 - Digest.docx 2010 IEEE Intemational Solid-State Circuits Conference DIGEST OF TECHNICAL PAPERS
  • 在Swift中复制Yahoo News Digest iOS应用 重新创建流行的Yahoo News Digest iOS应用。 此项目涵盖此Apple Design Award应用程序的以下UI方面: 粘页眉 梯形集管 为了给该项目增加些许变化,在显示新闻时添加了淡入...
  • T-digest

    2020-07-20 22:38:41
    目录算法原理示例T-digest的建立T-digest的查询相关链接 上一篇博客中讲述了使用RandomRandomRandom算法进行quantilequantilequantile估算,详情可见Random,本博客将讲诉另外一个quantilequantilequantile估算算法...

    上一篇博客中讲述了使用 R a n d o m Random Random算法进行 q u a n t i l e quantile quantile估算,详情可见Random,本博客将讲诉另外一个 q u a n t i l e quantile quantile估算算法: T − d i g e s t T-digest Tdigest,该算法理论基础可以参考Computing Extremely Accurate Quantiles Using t-Digest

    算法

    算法原理

    该算法的思想是将输入数据表示缩减成簇的集合 { C i } 1 m \{C_{i}\}^m_1 {Ci}1m,每个簇表示为: ( C i , C c o u n t ) (C_i,C_{count}) (Ci,Ccount) C i C_i Ci表示该簇的中心,一般是等于簇中元素的平均值, C c o u n t C_{count} Ccount则是该簇中对应的元素的数量。簇的大小极大影响了算法的准确率,假设簇的较大,则会导致结果误差偏大;假设簇的大小较小,则会导致结果准确,但另一方面计算的复杂度对增加。对于一般的问题而言,我们更加关注位于两端的 q u a n t i l e quantile quantile(即靠近 0 0 0或者 1 1 1),即: q u a n t i l e quantile quantile位于中间部分的簇容量较大;相应地, q u a n t i l e quantile quantile位于两端的簇的容量较小。给出如下公式:
    k ( q , σ ) = σ 2 π a r c s i n ( 2 q − 1 ) (1) k(q,\sigma)=\frac{\sigma}{2\pi}arcsin(2q-1)\tag{1} k(q,σ)=2πσarcsin(2q1)(1)
    其中: q q q为簇对应的分位数, σ \sigma σ为压缩系数。
    则对应的某段 q u a n t i l e quantile quantile所能代表的量化长度为:
    K ( C i ) = k ( q ( c i ) , σ ) − k ( q ( c i − 1 ) , σ ) (2) K(C_{i})=k(q(c_{i}),\sigma)-k(q(c_{i-1}),\sigma)\tag{2} K(Ci)=k(q(ci),σ)k(q(ci1),σ)(2)
    其中: K ( C 1 ) = k ( q ( c 1 ) , σ ) K(C_{1})=k(q(c_1),\sigma) K(C1)=k(q(c1),σ)
    另外, T − d i g e s t T-digest Tdigest还需满足以下性质:
    { K ( c i ) = ≤ 1 K ( c i ) + K ( c i + 1 ) > 1 (3) \left\{ \begin{aligned} K(c_i) &= & \leq1 \\ K(c_i)+K(c_{i+1})&>&1 \end{aligned} \right.\tag{3} {K(ci)K(ci)+K(ci+1)=>11(3)
    对于某个簇 C i C_{i} Ci而言,其所能接受的最大 q u a n t i l e quantile quantile为:
    q l i m i t = 1 2 [ 1 + s i n ( a r c s i n ( 2 × q ( c i ) − 1 ) + 2 π σ ) ] q_{limit}=\frac{1}{2}[1+sin(arcsin(2\times q(c_i)-1)+\frac{2\pi}{\sigma})] qlimit=21[1+sin(arcsin(2×q(ci)1)+σ2π)]
    故当某个新元素到来时,若将其加入到当前簇 C i C_i Ci时,若 q q q将大于 q l i m i t q_{limit} qlimit,则不将其加入;否则,则将其加入。下图给出了其算法示意图:
    算法
    算法

    空间消耗及错误界限

    压缩系数 σ \sigma σ b u f f e r buffer buffer大小 k k k,簇的数量 ⌊ σ 2 ⌋ ≤ m ≤ ⌈ σ ⌉ \lfloor \frac{\sigma}{2} \rfloor\leq m \leq \lceil \sigma \rceil 2σmσ
    空间消耗
    不像其他 q u a n t i l e quantile quantile估算算法,该算法的准确率 ϵ \epsilon ϵ正比于 q × ( 1 − q ) q\times (1-q) q×(1q),其中 q q q就是分位数。

    示例

    T-digest的建立

    示例
    算法
    示例

    T-digest的查询

    分位数查询
    分位数查询
    分位数查询

    相关链接

    TDigest 算法原理
    TDigest_PPT

    展开全文
  • matsuu / pt-query-digest 用法 分析慢查询日志 cat mysql-slow.log | docker run -i --rm matsuu/pt-query-digest > analyzed-slow.log 分析tcpdump cat dump.log | docker run -i --rm matsuu/pt-query-digest ...
  • MD5 digest 算法

    2013-11-16 16:25:24
    用户输入需要通过MD5 digest的内容,程序给出digest输出结果
  • pilots_digest-源码

    2021-03-28 07:28:19
    pilots_digest 描述 该站点使您可以吸收波音787的五本主要飞行手册中的所有重要信息。(任何公司的特定信息目前都已被编辑)
  • ISSCC 2019 - Digest.rar

    2020-04-06 00:05:29
    ISSCC2019 - Digest.docx ISSCC2019 - Digest.pdf 1 Plenary Session 2 Processors 3 Nyquist Rate ADCs 4 Power Amplifiers 5 Image Sensors 6 Ultra-High-Speed Wireline 7 Machine Learning ...
  • perl-Digest-CRC-源码

    2021-03-20 02:30:00
    perl-Digest-CRC
  • 一个模拟http 401 Digest认证的登录海康NVR抓取摄像头列表的小demo
  • Digest Auth 认证

    千次阅读 2019-01-22 15:50:54
    本人写的Digest 认证一次通过,不需要按照常规的方式来  public void postMethod(String url, String query) { try { CredentialsProvider credsProvider = new BasicCredentialsProvider(); ...

    本人写的Digest 认证一次通过,不需要按照常规的方式来 

     public void postMethod(String url, String query) {
    		  try {
    
    			  CredentialsProvider credsProvider = new BasicCredentialsProvider();
    		        credsProvider.setCredentials(
    		                new AuthScope("192.168.1.105", 9000),//请求地址 + 端口号
    		                new UsernamePasswordCredentials("admin", "admin"));// 用户名 + 密码 (用于验证)
    		        CloseableHttpClient httpclient = HttpClients.custom()
    		                .setDefaultCredentialsProvider(credsProvider)
    		                .build();
    			  HttpPost postMethod = new HttpPost(url);//请求详细地址(如:http://192.168.1.105:9000/MotorVehicles)
    			  StringEntity s = new StringEntity(query);//向后台传的json数据
    			  s.setContentEncoding("utf-8");//编码
    			  s.setContentType("application/json");//发送json数据需要设置contentType
    			  postMethod.setEntity(s);
    			  HttpResponse response = httpclient.execute(postMethod); //执行POST方法
    			  
    			  System.out.println("resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
    			  
    			  System.out.println("result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容
    			 
    			} catch (Exception e) {
    				System.out.println("推送失败:"+e);
    			}
    		 
    		  }

    正常认证方式:

    1. 发送一个请求

          GET /auth/basic/ HTTP/1.1
          HOST: target
    2. 服务器返回401响应头,要求输入用户凭据

          HTTP/1.1 401 Unauthorized
          WWW-Authenticate: Digest realm="Digest Encrypt",nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", opaque="0000000000000000",stale=false, algorithm=MD5, qop="auth"
    3. 输入凭据后再发送请求

          GET /auth/digest/ HTTP/1.1
          Accept: */*
          Authorization:  Digest username="LengWa", realm="Digest Encrypt",  qop="auth", algorithm="MD5", uri="/auth/digest/", nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", nc=00000001, cnonce="6092d3a53e37bb44b3a6e0159974108b", opaque="0000000000000000", response="652b2f336aeb085d8dd9d887848c3314"
    4. 服务端验证通过后返回数据

    展开全文
  • Digest-HMAC-1.03.tar.gz

    2021-06-30 17:27:00
    Digest-HMAC-1.03.tar.gz
  • TR069 Http Digest 认证流程
  • 本文主要介绍Android安全加密消息摘要Message Digest,这里整理了详细的资料,并说明如何使用Message Digest 和使用注意事项,有需要的小伙伴可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,465
精华内容 47,786
关键字:

digest