fix signed-integer-overflow issue:
Hash functions rely on 2's complement behaviour. Use unsigned integers to get that.
This commit is contained in:
@@ -215,10 +215,9 @@ private:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SIMD_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2)
|
SIMD_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2)
|
||||||
{
|
{
|
||||||
int key = static_cast<int>(((unsigned int)proxyId1) | (((unsigned int)proxyId2) <<16));
|
unsigned int key = proxyId1 | (proxyId2 << 16);
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
|
|
||||||
key += ~(key << 15);
|
key += ~(key << 15);
|
||||||
@@ -227,13 +226,11 @@ private:
|
|||||||
key ^= (key >> 6);
|
key ^= (key >> 6);
|
||||||
key += ~(key << 11);
|
key += ~(key << 11);
|
||||||
key ^= (key >> 16);
|
key ^= (key >> 16);
|
||||||
return static_cast<unsigned int>(key);
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SIMD_FORCE_INLINE btBroadphasePair* internalFindPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, int hash)
|
SIMD_FORCE_INLINE btBroadphasePair* internalFindPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, int hash)
|
||||||
{
|
{
|
||||||
int proxyId1 = proxy0->getUid();
|
int proxyId1 = proxy0->getUid();
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ private:
|
|||||||
|
|
||||||
SIMD_FORCE_INLINE unsigned int getHash(unsigned int indexA, unsigned int indexB)
|
SIMD_FORCE_INLINE unsigned int getHash(unsigned int indexA, unsigned int indexB)
|
||||||
{
|
{
|
||||||
int key = static_cast<int>(((unsigned int)indexA) | (((unsigned int)indexB) <<16));
|
unsigned int key = indexA | (indexB << 16);
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
|
|
||||||
key += ~(key << 15);
|
key += ~(key << 15);
|
||||||
@@ -134,7 +134,7 @@ private:
|
|||||||
key ^= (key >> 6);
|
key ^= (key >> 6);
|
||||||
key += ~(key << 11);
|
key += ~(key << 11);
|
||||||
key ^= (key >> 16);
|
key ^= (key >> 16);
|
||||||
return static_cast<unsigned int>(key);
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -105,9 +105,10 @@ public:
|
|||||||
//to our success
|
//to our success
|
||||||
SIMD_FORCE_INLINE unsigned int getHash()const
|
SIMD_FORCE_INLINE unsigned int getHash()const
|
||||||
{
|
{
|
||||||
int key = m_uid;
|
unsigned int key = m_uid;
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -120,7 +121,7 @@ class btHashPtr
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
const void* m_pointer;
|
const void* m_pointer;
|
||||||
int m_hashValues[2];
|
unsigned int m_hashValues[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -145,8 +146,7 @@ public:
|
|||||||
{
|
{
|
||||||
const bool VOID_IS_8 = ((sizeof(void*)==8));
|
const bool VOID_IS_8 = ((sizeof(void*)==8));
|
||||||
|
|
||||||
int key = VOID_IS_8? m_hashValues[0]+m_hashValues[1] : m_hashValues[0];
|
unsigned int key = VOID_IS_8? m_hashValues[0]+m_hashValues[1] : m_hashValues[0];
|
||||||
|
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
||||||
return key;
|
return key;
|
||||||
@@ -179,7 +179,7 @@ public:
|
|||||||
//to our success
|
//to our success
|
||||||
SIMD_FORCE_INLINE unsigned int getHash()const
|
SIMD_FORCE_INLINE unsigned int getHash()const
|
||||||
{
|
{
|
||||||
int key = m_uid;
|
unsigned int key = m_uid;
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
||||||
return key;
|
return key;
|
||||||
@@ -211,7 +211,7 @@ public:
|
|||||||
//to our success
|
//to our success
|
||||||
SIMD_FORCE_INLINE unsigned int getHash()const
|
SIMD_FORCE_INLINE unsigned int getHash()const
|
||||||
{
|
{
|
||||||
int key = m_uid;
|
unsigned int key = m_uid;
|
||||||
// Thomas Wang's hash
|
// Thomas Wang's hash
|
||||||
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
|
||||||
return key;
|
return key;
|
||||||
|
|||||||
Reference in New Issue
Block a user