Гуид. NewGuid ().GetHashCode () для DB

Это было бы надежно для использования в качестве идентификатора для хранения данных (SQL Server)?

Я использовал бы гуид, но я предпочитаю числовое значение.

5
задан Tomasi 23 February 2010 в 04:54
поделиться

7 ответов

Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?

Нет. Идентификаторы GUID - 128-битные, а хэш-коды - 32-битные. Поэтому обязательно возникают столкновения. Маловероятно, что вы когда-нибудь столкнетесь с ним, но нет гарантии, что вы никогда с ним не встретитесь.

Для надежности вам нужна гарантия того, что вы никогда не столкнетесь с столкновениями. Если вы настаиваете на использовании Guid.NewGuid (). GetHashCode () , тогда вам необходимо добавить логику для обнаружения коллизий. У идентификаторов GUID есть преимущества (и недостатки), но без дополнительной информации я бы предложил использовать автоматически увеличивающийся столбец int . Если вы говорите, что вам нужен числовой столбец, я бы предпочел использовать IDENTITY .

3
ответ дан 18 December 2019 в 14:45
поделиться

Настоящий GUID должен быть уникальным. Когда вы уменьшаете это до int (через GetHashCode), вероятность его уникальности уменьшается.

Есть одна веская причина использовать GUID (уникальность), и этот код удаляет эту функцию GUID.

3
ответ дан 18 December 2019 в 14:45
поделиться

Если вам нужно числовое значение, используйте столбец IDENTITY . Если вам нужен GUID, используйте уникальный идентификатор . Просто как тот.

Не пытайтесь смешивать и сочетать. Не используйте хеширование GUID для получения числового значения. Это оставит вам все недостатки столбца GUID (большие данные / индексы, разбиение страниц), в то же время стимулируя большинство преимуществ (фактическая уникальность, поддержка репликации). Кроме того, вы не получаете ни одного из преимуществ, которые дает вам последовательный числовой идентификатор, таких как временное упорядочение и производительность индекса.

3
ответ дан 18 December 2019 в 14:45
поделиться
Dim bom As New Dictionary(Of Long, Boolean)

Sub pageload() Handles Me.Load
    For i = 0 To 500
        Dim act As New Action(AddressOf collisionfind)
        act.BeginInvoke(Nothing, Nothing)
    Next
End Sub

Sub collisionfind()
    For index = 1 To 50000000
        Dim INTGUID = Guid.NewGuid.GetHashCode / 2 * Guid.NewGuid.GetHashCode / 2
        bom.Add(INTGUID, Nothing)
    Next
End Sub

Ну, думаю, в конце концов, это почти так же хорошо.

Никаких коллизий :D.

50000000 Loops на 500 потоков - это довольно тяжело. Для меня этого достаточно.

0
ответ дан 18 December 2019 в 14:45
поделиться

Это распространенный подход, и я сразу назову одну вескую причину, по которой стоит пойти этим путем. Вы можете генерировать GUID до того, как попадете в БД, поэтому вы можете выполнить, скажем, вставку асинхронно и заранее знать, каким будет ID.

Убедитесь, что тип данных вашего первичного ключа - UNIQUEIDENTIFIER, и все готово.

-1
ответ дан 18 December 2019 в 14:45
поделиться

Я бы сказал, просто используйте GUID в качестве значения в столбце. Тогда никаких проблем.

1
ответ дан 18 December 2019 в 14:45
поделиться

A guid с большей вероятностью представляет запись уникально, чем числовое значение.

Наряду с:

  • GUID обеспечивают глобальную уникальность
  • GUID можно перемещать между базами данных приятно
  • GUID уменьшают количество соединений требуемых

См. это: Первичный ключ Guid или Int?

4
ответ дан 18 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: