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
next prev parent 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.