From def884ff37641cc6d53bc905acaa5e5cd4d9aac0 Mon Sep 17 00:00:00 2001
From: Jukka Zitting <jukka@apache.org>
Date: Tue, 28 Sep 2010 18:10:24 +0200
Subject: [PATCH] JCR-2760: Use hash codes instead of sequence numbers for string indexes

---
 .../jackrabbit/core/NamespaceRegistryImpl.java     |   13 ++++++-------
 .../core/persistence/util/HashMapIndex.java        |    9 +++++++--
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
index ef6335b..06f090b 100644
--- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
+++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
@@ -91,8 +91,6 @@ public class NamespaceRegistryImpl implements
     private HashMap<Integer, String> indexToURI = new HashMap<Integer, String>();
     private HashMap<String, Integer> uriToIndex = new HashMap<String, Integer>();
 
-    private int lastIndex;
-
     private final FileSystem nsRegStore;
 
     /**
@@ -143,10 +141,11 @@ public class NamespaceRegistryImpl implements
         uriToPrefix.put(uri, prefix);
         if (!uriToIndex.containsKey(uri)) {
             if (idx == null) {
-                idx = ++lastIndex;
-            } else {
-                if (idx.intValue() > lastIndex) {
-                    lastIndex = idx.intValue();
+                // Need to use only 24 bits, since that's what
+                // the BundleBinding class stores in bundles
+                idx = uri.hashCode() & 0x00ffffff;
+                while (indexToURI.containsKey(idx)) {
+                    idx = (idx + 1) & 0x00ffffff;
                 }
             }
             indexToURI.put(idx, uri);
@@ -339,7 +338,7 @@ public class NamespaceRegistryImpl implements
         if (idx == null) {
             throw new IllegalArgumentException("Namespace not registered: " + uri);
         }
-        return idx.intValue();
+        return idx;
     }
 
     /**
diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java
index c14f98e..ca55d0d 100644
--- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java
+++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/HashMapIndex.java
@@ -139,7 +139,12 @@ public class HashMapIndex implements StringIndex {
             idx = stringToIndex.get(nsUri);
         }
         if (idx == null) {
-            idx = Integer.valueOf(indexToString.size());
+            // Need to use only 24 bits, since that's what
+            // the BundleBinding class stores in bundles
+            idx = nsUri.hashCode() & 0x00ffffff;
+            while (indexToString.containsKey(idx)) {
+                idx = (idx + 1) & 0x00ffffff;
+            }
             stringToIndex.put(nsUri, idx);
             indexToString.put(idx, nsUri);
             stringToIndexProps.put(nsUri, idx.toString());
@@ -151,7 +156,7 @@ public class HashMapIndex implements StringIndex {
                 throw ise;
             }
         }
-        return idx.intValue();
+        return idx;
     }
 
     /**
-- 
1.6.2.5

