all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Lars Magne Ingebrigtsen <larsi@gnus.org>
To: 13949@debbugs.gnu.org
Subject: bug#13949: 24.4.1; `fill-paragraph' should not always put the buffer as modified
Date: Mon, 28 Mar 2016 13:27:49 +0200	[thread overview]
Message-ID: <m3shzac05m.fsf@gnus.org> (raw)
In-Reply-To: <m3a8lidgxx.fsf@gnus.org> (Lars Magne Ingebrigtsen's message of "Mon, 28 Mar 2016 12:39:54 +0200")

I've now made a simple buffer hashing function (that does not take text
properties into account) to see how slow this would be.

The following form

(with-temp-buffer
  (dotimes (i 10000)
    (insert (make-string 100 ?k) "\n"))
  (benchmark-run 1000 (buffer-hash)))

takes 2.7 seconds (that's 1000 1MB buffers), and unsurprisingly

(with-temp-buffer
  (dotimes (i 10000000)
    (insert (make-string 100 ?k) "\n"))
  (benchmark-run 1 (progn (message "%s" (buffer-size) (buffer-hash)))))

(which is 1 1GB buffer) takes the same amount of time.  :-)

(This is on a 2.7GHz i5 from like five years ago.)

So on big buffers this isn't really something you'd want to run a lot,
but it's workable (especially since in the `M-q' case you'd only run it
if the buffer isn't already modified).

So...  

diff --git a/src/fns.c b/src/fns.c
index 0e3fc27..d027058 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -4737,6 +4737,22 @@ It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
 #include "sha256.h"
 #include "sha512.h"
 
+static Lisp_Object
+make_digest_string (Lisp_Object digest, int digest_size)
+{
+  unsigned char *p = SDATA (digest);
+  int i;
+
+  for (i = digest_size - 1; i >= 0; i--)
+    {
+      static char const hexdigit[16] = "0123456789abcdef";
+      int p_i = p[i];
+      p[2 * i] = hexdigit[p_i >> 4];
+      p[2 * i + 1] = hexdigit[p_i & 0xf];
+    }
+  return digest;
+}
+
 /* ALGORITHM is a symbol: md5, sha1, sha224 and so on. */
 
 static Lisp_Object
@@ -4936,17 +4952,7 @@ It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
 	     SSDATA (digest));
 
   if (NILP (binary))
-    {
-      unsigned char *p = SDATA (digest);
-      for (i = digest_size - 1; i >= 0; i--)
-	{
-	  static char const hexdigit[16] = "0123456789abcdef";
-	  int p_i = p[i];
-	  p[2 * i] = hexdigit[p_i >> 4];
-	  p[2 * i + 1] = hexdigit[p_i & 0xf];
-	}
-      return digest;
-    }
+    return make_digest_string (digest, digest_size);
   else
     return make_unibyte_string (SSDATA (digest), digest_size);
 }
@@ -4997,6 +5003,44 @@ It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
 {
   return secure_hash (algorithm, object, start, end, Qnil, Qnil, binary);
 }
+
+DEFUN ("buffer-hash", Fbuffer_hash, Sbuffer_hash, 0, 1, 0,
+       doc: /* Return a hash of the contents of BUFFER-OR-NAME.
+If nil, use the current buffer." */ )
+     (Lisp_Object buffer_or_name)
+{
+  Lisp_Object buffer;
+  struct buffer *b;
+  struct sha1_ctx ctx;
+  Lisp_Object digest = make_uninit_string (SHA1_DIGEST_SIZE * 2);
+
+  if (NILP (buffer_or_name))
+    buffer = Fcurrent_buffer ();
+  else
+    buffer = Fget_buffer (buffer_or_name);
+  if (NILP (buffer))
+    nsberror (buffer_or_name);
+
+  b = XBUFFER (buffer);
+  sha1_init_ctx (&ctx);
+
+  /* Process the first part of the buffer. */
+  sha1_process_bytes (BUF_BEG_ADDR (b),
+		      BUF_GPT_BYTE (b) - BUF_BEG_BYTE (b),
+		      &ctx);
+
+  /* If the gap is before the end of the buffer, process the last half
+     of the buffer. */
+  if (BUF_GPT_BYTE (b) < BUF_Z_BYTE (b))
+    sha1_process_bytes (BUF_GAP_END_ADDR (b),
+			BUF_Z_BYTE (b) - (BUF_GPT_BYTE (b) + BUF_GAP_SIZE (b)),
+			&ctx);
+
+  sha1_finish_ctx (&ctx, SSDATA (digest));
+  return make_digest_string (digest, SHA1_DIGEST_SIZE);
+}
+
+
 \f
 void
 syms_of_fns (void)
@@ -5156,6 +5200,7 @@ It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
   defsubr (&Sbase64_decode_string);
   defsubr (&Smd5);
   defsubr (&Ssecure_hash);
+  defsubr (&Sbuffer_hash);
   defsubr (&Slocale_info);
 
   hashtest_eq.name = Qeq;


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no






  reply	other threads:[~2016-03-28 11:27 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-13 22:09 bug#13949: 24.3.50; `fill-paragraph' should not always put the buffer as modified Dani Moncayo
2013-03-14  3:43 ` Eli Zaretskii
2013-03-14  7:57   ` Dani Moncayo
2013-03-14 10:27     ` Andreas Röhler
2013-03-14 17:50       ` Eli Zaretskii
2013-03-14 13:38     ` Stefan Monnier
2013-03-14 17:53       ` Eli Zaretskii
2013-03-14 18:34         ` Andreas Röhler
2013-03-14 18:49           ` Eli Zaretskii
2013-03-14 19:01             ` Andreas Röhler
2013-03-14 19:19               ` Eli Zaretskii
2013-03-14 19:32                 ` Andreas Röhler
2013-03-15  4:02         ` Stefan Monnier
2013-03-15  7:27           ` Dani Moncayo
2013-03-14 17:46     ` Eli Zaretskii
2013-03-14 18:34       ` Dani Moncayo
2016-03-22 10:50 ` bug#13949: 24.4.1; " Jaakov
2016-03-22 11:39   ` Andreas Röhler
2016-03-22 16:15   ` Eli Zaretskii
2016-03-22 17:40     ` Jaakov
2016-03-22 17:56       ` Michael Heerdegen
2016-03-22 18:07         ` Drew Adams
2016-03-22 18:23           ` Michael Heerdegen
2016-03-22 18:31       ` Eli Zaretskii
2016-03-22 18:42         ` Jaakov
2016-03-26 23:46           ` John Wiegley
2016-03-27  3:31             ` Óscar Fuentes
2016-03-27  7:44               ` Andreas Röhler
2016-03-27 15:09                 ` Óscar Fuentes
2016-03-28  8:01                   ` Andreas Röhler
2016-03-27  8:42               ` Andreas Schwab
2016-03-27 14:59                 ` Óscar Fuentes
2016-03-27 15:15                   ` Drew Adams
2016-03-27 15:21                     ` Óscar Fuentes
2016-03-27 18:53                     ` Drew Adams
2016-03-27 15:13                 ` Drew Adams
2016-03-27 14:56               ` Eli Zaretskii
2016-03-27 15:28                 ` Óscar Fuentes
2016-03-27 15:42                   ` Dmitry Gutov
2016-03-27 15:52                     ` Óscar Fuentes
2016-03-27 15:57                       ` Lars Magne Ingebrigtsen
2016-03-27 16:21                         ` Óscar Fuentes
2016-03-27 16:33                           ` Lars Magne Ingebrigtsen
2016-03-27 16:46                             ` Óscar Fuentes
2016-03-27 16:58                               ` Lars Magne Ingebrigtsen
2016-03-27 18:22                                 ` Drew Adams
2016-03-27 15:29                 ` Óscar Fuentes
2016-03-27 15:58                   ` Eli Zaretskii
2016-03-27 16:05                     ` Óscar Fuentes
2016-03-27 16:12                       ` Eli Zaretskii
2016-03-27 16:37                         ` Óscar Fuentes
2016-03-27 16:50                           ` Eli Zaretskii
2016-03-27 17:30                             ` Óscar Fuentes
2016-03-27 17:51                               ` Eli Zaretskii
2016-03-27 16:38                         ` Óscar Fuentes
2016-03-27 17:00                           ` Lars Magne Ingebrigtsen
2016-03-27 16:14                       ` Lars Magne Ingebrigtsen
2016-03-27 15:46                 ` Lars Magne Ingebrigtsen
2016-03-27 16:04                   ` Eli Zaretskii
2016-03-27 16:11                     ` Lars Magne Ingebrigtsen
2016-03-27 16:18                       ` Eli Zaretskii
2016-03-27 16:28                         ` Lars Magne Ingebrigtsen
2016-03-28 10:39                           ` Lars Magne Ingebrigtsen
2016-03-28 11:27                             ` Lars Magne Ingebrigtsen [this message]
2016-03-28 11:32                               ` Lars Magne Ingebrigtsen
2016-03-28 11:39                                 ` Lars Magne Ingebrigtsen
2016-03-28 13:46                               ` Lars Magne Ingebrigtsen
2016-03-28 15:29                               ` Eli Zaretskii
2016-03-28 15:39                                 ` Lars Magne Ingebrigtsen
2016-03-28 15:15                             ` Eli Zaretskii
2016-03-28 15:39                               ` Lars Magne Ingebrigtsen
2016-03-28 15:52                                 ` Óscar Fuentes
2016-03-28 16:29                                   ` Lars Magne Ingebrigtsen
2016-03-28 17:04                                     ` Eli Zaretskii
2016-03-28 17:07                                       ` Lars Magne Ingebrigtsen
2016-03-28 17:37                                         ` Eli Zaretskii
2016-03-28 17:45                                           ` Lars Magne Ingebrigtsen
2016-03-28 18:17                                             ` Eli Zaretskii
2016-03-28  8:09                 ` Andreas Röhler
2016-03-27 15:28               ` Dmitry Gutov
2016-03-27 15:35                 ` Óscar Fuentes
2016-03-27 15:46                   ` Dmitry Gutov
2016-03-27 15:53                     ` Lars Magne Ingebrigtsen
2016-03-27 20:24                       ` Dmitry Gutov
2016-03-27 21:05                         ` Óscar Fuentes
2016-03-27 21:20                           ` Dmitry Gutov
2016-03-27 22:03                             ` Óscar Fuentes
2016-03-27 15:35                 ` Lars Magne Ingebrigtsen
2016-03-27 15:42                   ` Dmitry Gutov
2016-03-27 15:50                     ` Lars Magne Ingebrigtsen
2016-03-27 20:27                       ` Dmitry Gutov
2016-03-27 21:36                         ` Jaakov
2016-03-27 16:08                   ` Jaakov
2016-03-22 17:52     ` Jaakov
2016-03-22 18:40 ` bug#13949: (no subject) Jaakov
2016-03-22 18:56   ` Eli Zaretskii
2016-03-22 19:07     ` Jaakov
2016-03-22 19:10       ` Eli Zaretskii
2016-03-22 19:53         ` Jaakov
2016-03-22 20:07           ` Eli Zaretskii
2016-03-22 21:58             ` Jaakov
2016-03-22 22:38               ` Glenn Morris
2016-03-23 15:57                 ` Eli Zaretskii
2016-03-23 17:45                   ` Jaakov
2016-03-26 23:33                 ` John Wiegley
2016-03-23 15:57               ` Eli Zaretskii
2016-03-22 23:44 ` bug#13949: `fill-paragraph' should not always put the buffer as modified Petros Travioli
2016-03-28  4:55 ` bug#13949: fill-paragraph is buggy, but using MD5 is even more buggy Petros Travioli
2016-03-28 10:32   ` Andreas Schwab
2016-03-28 13:29     ` bug#13949: Aw: " Petros Travioli
2016-03-28 14:31       ` Andreas Schwab
2016-03-28 17:05       ` Eli Zaretskii
2016-03-28 15:16 ` Petros Travioli
2016-03-28 17:05   ` Lars Magne Ingebrigtsen
2016-03-28 17:06   ` Eli Zaretskii
2016-03-28 19:03     ` Petros Travioli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3shzac05m.fsf@gnus.org \
    --to=larsi@gnus.org \
    --cc=13949@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.